옵셔널 체이닝(Optional Chaining)

썹스·2022년 11월 11일

Swift 문법

목록 보기
38/68

옵셔널 체이닝(Optional Chaining)

옵셔널 체이닝(Optional Chaining)은 옵셔널 타입의 객체에 대하여 반복적(연쇄적)으로 접근하는 방식의 문법입니다.

옵셔널 타입의 객체에 접근할 때는 접근 연산자( . )를 사용하여 접근합니다.

옵셔널 체이닝의 마지막 결과값은 항상 옵셔널 타입이며, 옵셔널 체이닝 중간 결과값이 nil일 경우 결과값은 nil로 반환됩니다.

마지막 결과값이 항상 옵셔널 타입이라 해서 마지막 멤버에 물음표(?)를 붙이지는 않습니다.

✅ 옵셔널 체이닝의 특징 요약

  • 옵셔널 타입에 대하여 접근 연산자( . )를 호출하는 방법입니다. => 객체?.멤버

  • 옵셔널 체이닝의 마지막 결괏값은 항상 옵셔널 타입입니다.

  • 옵셔널 체이닝의 중간값이 nil일 경우, 결괏값을 nil로 반환합니다.

  • 옵셔널 체이닝의 마지막 멤버는 물음표( ? )를 붙이지 않습니다.

✅ 옵셔널 체이닝을 사용한 문법

class Man{
    var name: String?
    var age: Int

    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
}

var kim: Man? = Man(name: "김철수", age: 20)
print(kim?.name)   // Optional("김철수")



// "인스턴스(멤버)?.멤버" 형태의 옵셔널 체이닝 => kim?.name
// 옵셔널 체이닝의 마지막 멤버(name)는 물음표( ? )를 붙이지 않습니다. => name 속성이 옵셔털 타입이지만, 물음표( ? )를 붙이지 않습니다.
// 결괏값은 옵셔널 타입입니다. => Optional("김철수")

📌 특이한 형태의 옵셔널 체이닝

✅ 옵셔널 체이닝의 함수 관련 표기법

함수명?( )?

? : 함수가 없을 가능성이 있다는 뜻의 물음표(?)
즉, 함수가(myOccupation) 없을 가능성이 있다는 의미

? : 함수의 결괏값이 없을 가능성이 있다는 뜻의 물음표(?)
즉, 함수(occupationType)의 return value가 nil일 가능성이 있다는 의미

class Man{
    var name: String? = "아무개"
    var myOccupation: (() -> Occupation?)?
   
    init(function: @escaping () -> Occupation?){
        self.myOccupation = function
    }
}

class Occupation{
    var occupationName: String?
}

func occupationType() -> Occupation?{
    let ocp = Occupation()
    ocp.occupationName = "ios 개발자"
    return ocp
}



var kim: Man? = Man(function: occupationType)
print(kim?.name)   //Optional("아무개")
print(kim?.myOccupation?()?.occupationName)   //Optional("ios 개발자")

✅ 옵셔널 체이닝의 딕셔너리 관련 표기법

딕셔너리명?[ ]?

? : 딕셔너리가 없을 가능성이 있다는 뜻의 물음표(?)
? : 딕셔너리의 결괏값이 없을 가능성이 있다는 뜻의 물음표(?)

class OccupationType{
    var occupation: [String: Man]?
}

class Man{
    var name: String?
}

var kim = Man()
kim.name = "김철수"

var shin = Man()
shin.name = "신짱구"



var occupationType = OccupationType()
occupationType.occupation = ["iOS": kim, "android": shin]

print(occupationType.occupation?["iOS"]?.name)   // Optional("김철수")
profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글