[다양한 표현 및 확장] 11. 옵셔널 체이닝과 nil 병합

Seoyoung Lee·2022년 2월 24일
0


2021년 12월 29일에 공부한 내용입니다.

1. 옵셔널 체이닝

  • 옵셔널 체이닝은 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용할 수 있다.
  • 매번 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 seoyoung: Person? = Person(name: "seoyoung")
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: seoyoung)

// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
    if let guardJob = owner.home?.guard?.job {
        print("우리집 경비원의 직업은 \(guardJob)입니다")
    } else {
        print("우리집 경비원은 직업이 없어요")
    }
}

guardJobWithOptionalChaining(owner: seoyoung)
// 우리집 경비원은 직업이 없어요

seoyoung?.home?.guard?.job // nil
seoyoung?.home = apart
seoyoung?.home // Optional(Apartment)
seoyoung?.home?.guard // nil

seoyoung?.home?.guard = superman
seoyoung?.home?.guard // Optional(Person)

seoyoung?.home?.guard?.name // superman
seoyoung?.home?.guard?.job // nil

seoyoung?.home?.guard?.job = "경비원"

2. nil 병합 연산자

  • 중위 연산자이다. ??
  • Optional ?? Value
  • 옵셔널 값이 nil일 경우 우측의 값을 반환한다.
  • 띄어쓰기에 주의!
var guardJob: String

guardJob = seoyoung?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원

seoyoung?.home?.guard?.job = nil

guardJob = seoyoung?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨
profile
나의 내일은 파래 🐳

0개의 댓글