구조체 또는 클래스 안에 프로퍼티로 구조체를 사용하고, 그 안에서 또 프로퍼티로 구조체를 사용하고, 이런 식으로 구조체를 타고 타고 사용해야 하는 경우가 있다.
프로퍼티 자체가 옵셔널인 경우 계속 nil인지 아닌지 체크를 해야 하는데, 이 때 옵셔널 체이닝을 유용하게 사용할 수 있다.
class Person {
var name: String
var job: String?
var home: Apartment?
init(name: String) {
self.name = name
}
}
class Apartment {
var buildingNumber: String
var roomNumber: String
var `guard`: Person?
var owner: Person?
init(dong: String, ho: String) {
buildingNumber = dong
roomNumber = ho
}
}
let yagom: Person? = Person(name: "yagom")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
// 우리집 경비원의 직업을 알고 싶을 때
// 옵셔널 체이닝을 사용하지 않는다면
func guardJob(owner: Person?) {
if let owner = owner {
if let home = owner.home {
if let `guard` = home.guard {
if let guardJob = `guard`.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
}
}
}
// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
guardJobWithOptionalChaining(owner: yagom)
// 우리집 경비원은 직업이 없어요
yagom?.home = apart
print(yagom?.home) // Optional(Apartment)
print(yagom?.home?.guard) // nil
owner?.home?.guard?.job
을 예로 들면 중간에 하나라도 nil이 있으면 거기서 멈추고 nil을 반환한다.
var guardJob: String
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원
nil 병합 연산자 ??
을 쓰면 yagom?.home?.guard?.job의 값이 nil일 때 "슈퍼맨"을 guardJob에 반환한다.
야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.