
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 geuni: Person? = Person(name: "geuni")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
옵셔널 체이닝을 사용하면 geuni의 home 프로퍼티가 nil일 때도 안전하게 접근할 수 있습니다. 중첩된 옵셔널 프로퍼티를 간결하게 접근할 수 있어 코드가 보다 직관적입니다.
// 옵셔널 체이닝을 사용하지 않는 경우
func guardJob(owner: Person?) {
if let owner = owner { // owner가 nil인지 확인
if let home = owner.home { // home이 nil인지 확인
if let `guard` = home.guard { // guard가 nil인지 확인
if let guardJob = `guard`.job { // guard의 job이 nil인지 확인
print("우리집 경비원의 직업은 \(guardJob)입니다.")
} else {
print("우리집 경비원은 직업이 없어요.")
}
}
}
}
}
guardJob(owner: geuni) // 출력: "우리집 경비원은 직업이 없어요."
옵셔널 체이닝 없이 각 단계에서 옵셔널을 언래핑해야 하며, 이로 인해 코드가 길어지고 가독성이 떨어집니다.
// 옵셔널 체이닝을 사용하는 경우
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job { // 옵셔널 체이닝을 사용하여 안전하게 접근
print("우리집 경비원의 직업은 \(guardJob)입니다.")
} else {
print("우리집 경비원은 직업이 없어요.")
}
}
guardJobWithOptionalChaining(owner: geuni) // 출력: "우리집 경비원은 직업이 없어요."
옵셔널 체이닝을 사용하면 guardJob의 값이 nil일 경우, 자동으로 else 블록으로 넘어가게 되어 코드가 간결하고 안전해집니다.
// 옵셔널 체이닝을 통해 직접 결과 확인
geuni?.home?.guard?.job // nil: geuni의 home이 없으므로 결과는 nil
// 집을 설정하고 경비원 설정
geuni?.home = apart
geuni?.home // Optional(Apartment): geuni의 home 프로퍼티에 apartment 설정됨
geuni?.home?.guard // nil: 아직 guard 설정되지 않음
// 경비원 설정
geuni?.home?.guard = superman
geuni?.home?.guard // Optional(Person): geuni의 home에 guard가 설정됨
// 경비원의 이름과 직업 확인
geuni?.home?.guard?.name // "superman": 경비원의 이름
geuni?.home?.guard?.job // nil: 경비원의 직업은 설정되지 않음
// 경비원의 직업 설정
geuni?.home?.guard?.job = "경비원"
geuni?.home?.guard?.job // "경비원": 직업 설정 완료
옵셔널 체이닝을 통해 중첩된 옵셔널 프로퍼티에 안전하게 접근하고, 값을 설정하거나 확인할 수 있습니다.
var guardJob: String
// 옵셔널 체이닝 결과가 nil일 경우 기본값 "슈퍼맨"을 사용
guardJob = geuni?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 출력: "경비원" (geuni의 home.guard.job이 설정됨)
// 옵셔널 체이닝 결과가 nil일 경우 기본값 "슈퍼맨"을 사용
geuni?.home?.guard?.job = nil
guardJob = geuni?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 출력: "슈퍼맨" (geuni의 home.guard.job이 nil로 설정됨)
nil 병합 연산자는 옵셔널 값이 nil일 때 지정한 기본값을 사용하여 코드의 안정성을 높입니다. 옵셔널 체이닝과 함께 사용하면 더욱 효과적으로 옵셔널 값을 처리할 수 있습니다.