본문 바로가기
iOS/Swift 문법 심화 학습

옵셔널 체이닝 [ Optional Chaining ]

by 황민우 2022. 2. 10.

정의

- nil일 수도 있는 프로퍼티나 메서드 그리고 서브 스크립트에 질의를 하는 과정입니다.

- 옵셔널이 프로퍼티나 메서드 혹은 서브스크립트에 대한 값을 가지고 있다면, 그 값을 반환합니다. ( nil값이면 nil 반환 )

- 여러 질의를 연결해서 할 수 있으며, 연결된 질의 중 하나라도 nil이면 전체 결과는 nil이 됩니다.


예제

클래스 생성

- Person Class와 Apartment Class를 생성하겠습니다.

- Person Class는 사람에 대한 정보를 갖는 클래스이고, Apartment는 집에 대한 정보를 갖는 클래스입니다.

- Person Class에 home 프로퍼티와 Apartment Class에 man, owner 프로퍼티에는 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 man: Person?
    var owner: Person?
    
    init(dong: String, ho: String){
        buildingNumber = dong
        roomNumber = ho
    }
}

 

인스턴스 생성

- 두 개의 클래스에 해당하는 인스턴스를 생성하겠습니다.

let SeaGreen: Person? = Person(name: "SeaGreen")
let apart: Apartment? = Apartment(dong: "101", ho: "101")
let superman: Person? = Person(name: "superman")

 

옵셔널 체이닝을 사용하지 않는 경우

- 옵셔널 체이닝을 사용하지 않고 코드를 작성한다면, 다음과 같은 코드가 작성됩니다.

- if let을 통해 nil값을 확인하며 긴 코드가 작성됩니다.

func guardJob(owner: Person?) {
    if let owner = owner {
        if let home = owner.home {
            if let man = home.man {
                if let guardJob = man.job {
                    print("아파트에 사는 남자의 직업은 \(guardJob)입니다.")
                } else {
                    print("아파트에 사는 남자는 직업이 없습니다.")
                }
            }
        }
    }
}

 

옵셔널 체이닝을 사용하는 경우

- 옵셔널 체이닝을 사용하는 경우엔 "owner?.home?.man?.job"처럼 코드를 작성해,

  연쇄적으로 프로퍼티에 값이 있는지를 확인합니다.

- "owner?.home?.man?.job"을 검사하는 단계 중 하나라도 nil 값에 해당하면 전체 결과는 nil값이 됩니다.

func optionalChaining(owner: Person?){
    if let guardJob = owner?.home?.man?.job {
        print("아파트에 사는 남자의 직업은 \(guardJob)입니다.")
    } else {
        print("아파트에 사는 남자는 직업이 없습니다.")
    }
}
optionalChaining(owner: SeaGreen)

 

옵셔널 체이닝 값 할당

- 옵셔널 체이닝을 통해 값을 불러오려했을때, nil값이 나오며 실행이 종료되었을 것입니다.

- 아래 코드를 통해 값을 할당하지 않았을 때, 어떤 결과가 출력될지 확인할 수 있습니다.

SeaGreen?.home?.man?.job    // nil

SeaGreen?.home = apart

SeaGreen?.home  // Optional(Apartment)
SeaGreen?.home?.man // nil

SeaGreen?.home?.man = superman
SeaGreen?.home?.man // Optional(Person)

SeaGreen?.home?.man?.name   // superman
SeaGreen?.home?.man?.job    // nil

SeaGreen?.home?.man?.job = "경비원"

nil 병합 연산자

- 옵셔널 체이닝을 통해 옵셔널 값이 아닌 기본값을 사용하려면 nil 병합 연산자를 사용하면 됩니다.

- nil 병합 연산자는 ?? 앞의 값이 nil이라면 뒤의 작성된 코드를 실행하는 문법입니다.

- 위의 예제에서 SeaGreen?.home?.man?.job = "경비원" 이라는 코드를 작성했기 때문에,

  SeaGreen?.home?.man?.job 값에는 경비원이라는 값이 들어있습니다. 따라서 첫 번째 구문의 실행결과는 "경비원"

  이라는 값이 출력될 것입니다.

- 첫 번째 구문이 끝나고 SeaGreen?.home?.man?.job = nil을 통해 SeaGreen?.home?.man?.job에 nil값을 할당했습니다.

  그렇기 때문에 두 번째 구문의 실행결과는 "슈퍼맨"이라는 값이 출력될 것입니다.

var guardJob: String

guardJob = SeaGreen?.home?.man?.job ?? "슈퍼맨"
print(guardJob)

SeaGreen?.home?.man?.job = nil

guardJob = SeaGreen?.home?.man?.job ?? "슈퍼맨"
print(guardJob)

내용 출처

https://www.youtube.com/watch?v=UANvklNnDeg 

https://jusung.gitbook.io/the-swift-language-guide/language-guide/16-optional-chaining

'iOS > Swift 문법 심화 학습' 카테고리의 다른 글

서브스크립트 [ Subscript ]  (0) 2022.02.15
프로퍼티 [ Properties ]  (0) 2022.02.14
inout  (0) 2022.02.09
mutating  (0) 2022.02.09
제네릭 [ Generic ]  (0) 2022.02.08

댓글