옵셔널 체이닝(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("김철수")