[swift] Optional Chaining 옵셔널 체이닝

이은수, Lee EunSoo·2024년 10월 10일
0

Swift Basic

목록 보기
23/24
post-thumbnail

개요

들어가기에 앞서 올셔널의 개념이 처음이라면 옵셔널에 대해서(링크) 미리 공부하고 보는것을 추천한다.

옵셔널 체이닝이란 옵셔널 데이터에 접근하는 방법중 하나이다.

특히나 중첩된 옵셔널 프로퍼티를 접근해야 하는 경우 코드가 굉장히 복잡해 질 수 있는데 옵셔널 체이닝을 이를 해결해준다.

설명

class Person {
    var home: Home?
}

class Home {
    var room: Room?
}

class Room {
    var number: Int?
}

var john = Person()

예를 들어 위 소스코드 처럼 옵셔널 저장 프로퍼티 인데 여러 타입의 중첩 인스턴스 라면 john인스턴스가 Room의 number프로퍼티에 접근하려면 코드는 다음과 같이 사용해야 될 것이다.

if let home = john.home {
    if let room = home.room {
        if let number = room.number {
            print("Room number is \(number)")
        } else {
            print("Room number is not available")
        }
    } else {
        print("Room is not available")
    }
} else {
    print("Home is not available")
}

if-let을 3중으로 하거나 ??연산자를 3중으로 해야 할것이다. 프로퍼티 하나 접근하기에는 코드가 너무 복잡해진다 그렇다고 !를 이용한 강제 언래핑을 하면 코드는 짧아 질 수 있겠으나 런타임에러 발생위험 때문에 별로 추천되는 방법은 아니다.

이를 해결하기 위해서 스위프트에서는 옵셔널 체이닝이라는 것을 제공한다

아래 코드를 보자

if let roomNumber = john.home?.room?.number {
    print("Room number is \(roomNumber)")
} else {
    print("Room number is not available")
}
Room number is not available

위 중첩 옵셔널 바인딩과 동일한 기능인데 코드가 아주 간단하게 옵셔널 데이터에 접근이 가능하다.

이처럼 옵셔널 체이닝은 옵셔널인 데이터를 접근하는데 사용되며 만약 그 데이터가 nil인 경우 nil을 반환한다.

체이닝을 이용한 프로퍼티 접근

var perfect_john = Person()
perfect_john.home = Home()
perfect_john.home?.room = Room()
perfect_john.home?.room?.number = 100

john = perfect_john

if let roomNumber = john.home?.room?.number {
    print("Room number is \(roomNumber)")
} else {
    print("Room number is not available")
}
Room number is 100

이 코드의 옵셔널 체이닝한 프로퍼티의 값을 저장하는 방식을 보자.

만약 위 코드에서 room number를 저장해놓고 사용하고 싶다면 어떻게 해야 할까?

정석적으로 그냥 각 인스턴스가 nil이 아닌 실제 인스턴스가 들어가게 만들어 주면 된다.

정리

중첩된 옵셔널 데이터에 편리하고 직관적으로 접근하기 위해서 옵셔널체이닝이라는 것을 할 수 있다.

profile
iOS 개발자 취준생, 천 리 길도 한 걸음부터

0개의 댓글