옵셔널 체이닝
- 옵셔널 체이닝은 옵셔널에 속해있는
nil
일지도 모르는 프로퍼티, 메소드, 서브스크립트 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정이다. 옵셔널에 값이 있다면 값을 추출할 수 있고, 값이 없다면 nil
을 반환한다.
옵셔널이 자전거 체인처럼 꼬리를 물고 이어져있기 때문에 옵셔널 체이닝
이라고 부른다.
!
- 옵셔널 체이닝에서
?
대신 !
을 사용하는 경우는 2가지 차이가 있다. 첫번째는 ?
을통해 옵셔널 값을 추출한다면 nil
인 경우 nil
을 반환하지만, !
인 경우에는 런타임 에러
가 발생하기때문에 왠만하면 ?
을 사용하는 것이 좋다.
class Room{
var number: Int
init(number: Int){
self.number = number
}
}
class Building {
var name: String
var room: Room?
init(name: String){
self.name = name
}
}
struct Address{
var province: String
var city: String
var street: String
var building: Building?
var detailAddress: String?
}
class Person{
var name: String
var address: Address?
init(name: String){
self.name = name
}
}
let yagom: Person = Person(name: "yagom")
let yagomRoomViaOptionalChaining: Int? = yagom.address?.building?.room?.number
let yagomRoomViaOptionalUnwrapping: Int = yagom.address!.building!.room!.number
옵셔널 체이닝을 통한 값 할당
yagom.address?.building?.room?.number = 505
print(yagom.address?.building?.room?.number)
yagom.address = Address(province: "충북 청주", city: "청주시 청원구", street: "충청대로", building: nil, detailAddress: nil)
yagom.address?.building = Building(name: "곰굴")
yagom.address?.building?.room = Room(number: 0)
yagom.address?.building?.room?.number = 505
print(yagom.address?.building?.room?.number)
- 옵셔널 체이닝을 통해
address
프로퍼티에 접근하는 경우 nil
이기 때문에 바로 nil
이 반환된다.
이니셜 라이저
를 통해 각 프로퍼티를 초기화하면서 값을 할당해야 한다.
옵셔널 체이닝을 통한 메소드 호출
struct Address{
var province: String
var city: String
var street: String
var building: Building?
var detailAddress: String?
init(province: String, city: String, street: String){
self.province = province
self.city = city
self.street = street
}
func fullAddress() -> String?{
var restAddress: String? = nil
if let buildingInfo: Building = self.building{
restAddress = buildingInfo.name
}else if let detail = self.detailAddress{
restAddress = detail
}
if let rest: String = restAddress{
var fullAddress: String = self.province
fullAddress += " " + self.city
fullAddress += " " + self.street
fullAddress += " " + rest
return fullAddress
}else{
return nil
}
}
func printAddress(){
if let address: String = self.fullAddress(){
print(address)
}
}
}
yagom.address?.fullAddress()?.isEmpty
yagom.address?.printAddress()
옵셔널 체이닝을 통한 서브스크립트 호출
let optionalArray : [Int]? = [1,2,3]
optionalArray?[1]
var optionalDictionary: [String: [Int]]? = [String: [Int]]()
optionalDictionary?["numberArray"] = optionalArray
optionalDictionary?["numberArray"?[2]
- 옵셔널 체이닝을 통한 서브스크립트 호출은
[]
앞에 ?
를 붙인다.