Swift/문법
옵셔널 체이닝 / nil 병합 연산자
khon98
2021. 1. 29. 21:08
옵셔널 체이닝
- 옵셔널 요소 내부의 프로퍼티로 또 다시 옵셔널이 연속적으로 연결되는 경우 유용하게 사용할 수 있음
nil 병합 연산자
- 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 khon: Person? = Person(name: "khon")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
func guardJobWithOptionalChaining(owner: Person?) {
// owner에 접근 후 값이 없으면 멈춤, 일치 하면 다음(.home)으로 넘어가고 이런 식으로 반복
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없습니다")
}
}
guardJobWithOptionalChaining(owner: khon)
// khon에 집이 할당이 되어 있지 않음, 값이 없으므로 nil 반환
khon?.home?.guard?.job // nil
// khon에 home 할당
khon?.home = apart
khon?.home // khon에 home이 있으므로 Optional(Apartment)
khon?.home?.guard // guard는 없으므로 nil
// guard 할당
khon?.home?.guard = superman
khon?.home?.guard // Optional(Person)
khon?.home?.guard?.name // superman
khon?.home?.guard?.job // job은 없으므로 nil
// 중간에 어느 하나라도 nil이면 실행 중단 하고 nil 반환
khon?.home?.guard?.job = "경비원"
// nil 병합 연산자
var guardJob: String
// 앞에 값이(khon?.home?.guard?.job) nil이라면 슈퍼맨을 guardJob에 넣어달라는 뜻
guardJob = khon?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원, job에 경비원을 할당해서 경비원 값이 출력
khon?.home?.guard?.job = nil // job에 nil값을 할당
guardJob = khon?.home?.guard?.job ?? "슈퍼맨" // job에 nil을 할당했기 때문에 슈퍼맨이 guardJob에 할당됨
print(guardJob) // 슈퍼맨