[Swift 정면돌파] 12. 옵셔널 체이닝

H43RO·2021년 8월 7일
1

Swift 정면돌파

목록 보기
12/19
post-thumbnail

오늘은 옵셔널 체이닝에 대하여 알아보았다. 코틀린과 용법과 그 목적이 비슷하다. 또한 코틀린의 엘비스 연산자 (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) // 슈퍼맨
profile
어려울수록 기본에 미치고 열광하라

0개의 댓글