오늘은 옵셔널 체이닝에 대하여 알아보았다. 코틀린과 용법과 그 목적이 비슷하다. 또한 코틀린의 엘비스 연산자 (Elvis Operator) 에 대응하는 ??
연산자도 친숙하게 다가갈 수 있었다. 스위프트도 코틀린과 같이 안정성을 중시하는 언어라서 그런지, 옵셔널 관련하여 다양한 구문을 사용해볼 수 있는 것 같다. 그런 의미에서 다음 포스팅에선 assert
/ guard
에 대하여 알아보자.
→ 옵셔널 체이닝은, 옵셔널 내부의 내부의 내부로 옵셔널이 연결돼있을 때
→ 매번 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 haero: Person? = Person(name: "H43RO")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
// 옵셔널 체이닝이 실행 후 결과값 (내부값) 이 nil일 수 있으므로
// 결과 타입도 옵셔널임
// 우리집의 경비원의 직업이 궁금할 때
// 옵셔널 체이닝을 사용하지 않는다면...
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("우리집 경비원은 직업이 없어요")
}
}
}
}
}
guardJob(owner: yagom)
// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
guardJobWithOptionalChaining(owner: yagom)
// 우리집 경비원은 직업이 없어요
haero?.home?.guard?.job // nil
haero?.home = apart
haero?.home // Optional(Apartment)
haero?.home?.guard // nil
// 경비원 할당
haero?.home?.guard = superman
haero?.home?.guard // Optional(Person)
haero?.home?.guard?.name // superman
haero?.home?.guard?.job // nil
haero?.home?.guard?.job = "경비원"
nli
병합 연산자→ 중위 연산자 ??
→ Optional ?? Value
→ 옵셔널 값이 nil
일 경우, 우측 값을 반환함
→ 띄어쓰기에 주의
var guardJob: String
guardJob = haero?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원
haero?.home?.guard?.job = nil
guardJob = haero?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨