[Swift] 옵셔널 체이닝

선주·2022년 4월 11일
0

Swift

목록 보기
9/20

구조체 또는 클래스 안에 프로퍼티로 구조체를 사용하고, 그 안에서 또 프로퍼티로 구조체를 사용하고, 이런 식으로 구조체를 타고 타고 사용해야 하는 경우가 있다.

프로퍼티 자체가 옵셔널인 경우 계속 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 yagom: Person? = Person(name: "yagom")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")

// 우리집 경비원의 직업을 알고 싶을 때
// 옵셔널 체이닝을 사용하지 않는다면
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("우리집 경비원은 직업이 없어요")
                }
            }
        }
    }
}

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

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

yagom?.home = apart
print(yagom?.home) // Optional(Apartment)
print(yagom?.home?.guard) // nil

owner?.home?.guard?.job을 예로 들면 중간에 하나라도 nil이 있으면 거기서 멈추고 nil을 반환한다.


📌 nil 병합 연산자

var guardJob: String
    
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원

nil 병합 연산자 ??을 쓰면 yagom?.home?.guard?.job의 값이 nil일 때 "슈퍼맨"을 guardJob에 반환한다.



야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.

profile
기록하는 개발자 👀

0개의 댓글