Swift/문법

옵셔널 체이닝 / nil 병합 연산자

khon98 2021. 1. 29. 21:08

옵셔널 체이닝

- 옵셔널 요소 내부의 프로퍼티로 또 다시 옵셔널이 연속적으로 연결되는 경우 유용하게 사용할 수 있음

 

 

nil 병합 연산자

- 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 khon: Person? = Person(name: "khon")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")

func guardJobWithOptionalChaining(owner: Person?) {
    // owner에 접근 후 값이 없으면 멈춤, 일치 하면 다음(.home)으로 넘어가고 이런 식으로 반복
    if let guardJob = owner?.home?.guard?.job {
        print("우리집 경비원의 직업은 \(guardJob)입니다")
    } else {
        print("우리집 경비원은 직업이 없습니다")
    }
}

guardJobWithOptionalChaining(owner: khon)


// khon에 집이 할당이 되어 있지 않음, 값이 없으므로 nil 반환
khon?.home?.guard?.job // nil

// khon에 home 할당
khon?.home = apart

khon?.home // khon에 home이 있으므로 Optional(Apartment)
khon?.home?.guard // guard는 없으므로 nil

// guard 할당
khon?.home?.guard = superman

khon?.home?.guard // Optional(Person)

khon?.home?.guard?.name // superman
khon?.home?.guard?.job // job은 없으므로 nil
// 중간에 어느 하나라도 nil이면 실행 중단 하고 nil 반환

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


// nil 병합 연산자
var guardJob: String

// 앞에 값이(khon?.home?.guard?.job) nil이라면 슈퍼맨을 guardJob에 넣어달라는 뜻
guardJob = khon?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원, job에 경비원을 할당해서 경비원 값이 출력

khon?.home?.guard?.job = nil // job에 nil값을 할당

guardJob = khon?.home?.guard?.job ?? "슈퍼맨" // job에 nil을 할당했기 때문에 슈퍼맨이 guardJob에 할당됨
print(guardJob) // 슈퍼맨