본문 바로가기
Swift/기본

옵셔널 체이닝

by 밤새는탐험가 2024. 4. 6.

옵셔널 체이닝 

옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 떄 활용할 수 있다.

매 번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있다. 

 

Person 클래스의 home 이라는 프로퍼티는 Apartment 클래스 타입을 사용한다.

Apartment 클래스의 guard, owner 프로퍼티는 Person 클래스 타입을 사용한다. 

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 jerry: Person? = Person(name: "jerry")
let jerryHome: Apartment? = Apartment(dong: "202", ho: "202")
let tom: Person? = Person(name: "tom")

 

옵셔널 체이닝이 실행 후 결과값이 nil일 수도 있기 때문에 

결과 타입도 옵셔널이다. 

 

guard의 직업을 알고 싶은 경우에 

먼저 옵셔널 체이닝을 사용하지 않는다면?

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: jerry)

 

 

옵셔널 체이닝을 사용한다면?

func guardJobWithOptionalChaining(owner: Person?) {
    if let guardJob = owner?.home?.guard?.job {
        print("우리집 경비원의 직업은 \(guardJob)입니다")
    } else {
        print("우리집 경비원은 직업이 없어요")
    }
}

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

 

 

nil 병합 연산자

중위 연산자 "??" 사용한다. 

띄어쓰기를 유의한다. 

 

var guardJob: String
    
guardJob = jerry!.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨

 

 

 

'Swift > 기본' 카테고리의 다른 글

프로토콜  (0) 2024.04.11
assert와 guard  (0) 2024.04.09
인스턴스의 생성과 소멸  (0) 2024.04.05
상속  (0) 2024.04.04
프로퍼티  (0) 2024.04.03