[swift] 옵셔널 체이닝에 대한 고급 사용 사례

옵셔널 체이닝은 Swift의 강력한 기능 중 하나로, 옵셔널 값에 대한 연속된 접근을 안전하게 처리할 수 있습니다. 기본적으로는 옵셔널 값이 null일 경우에도 안전하게 멈추지만, 이를 활용하여 특정한 활용 사례에 적용할 수 있습니다.

1. 옵셔널 체이닝을 사용한 속성 접근

class Person {
    var residence: Residence?
}

class Residence {
    var address: Address?
}

class Address {
    var street: String
    init(street: String) {
        self.street = street
    }
}

let person = Person()
if let street = person.residence?.address?.street {
    print("주소: \(street)")
} else {
    print("주소가 없습니다.")
}

위 예제에서 person의 residence 또는 residence의 address가 nil일 경우에도 안전하게 street 속성에 접근할 수 있습니다.

2. 옵셔널 체이닝을 사용한 메서드 호출

class Person {
    var residence: Residence?
}

class Residence {
    var address: Address?
    
    func printAddress() {
        if let street = address?.street {
            print("주소: \(street)")
        } else {
            print("주소가 없습니다.")
        }
    }
}

let person = Person()
person.residence?.printAddress()

위 예제에서는 residence가 nil일 경우에도 안전하게 printAddress 메서드를 호출할 수 있습니다.

3. 옵셔널 체이닝을 사용한 하위 스크립트 접근

class Person {
    var residence: Residence?
}

class Residence {
    var rooms: [Room] = []

    subscript(i: Int) -> Room? {
        if rooms.indices.contains(i) {
            return rooms[i]
        } else {
            return nil
        }
    }
}

class Room {
    var number: Int
    init(number: Int) {
        self.number = number
    }
}

let person = Person()
if let roomNumber = person.residence?[0]?.number {
    print("방 번호: \(roomNumber)")
} else {
    print("방이 없습니다.")
}

위 예제에서는 person의 residence가 nil일 경우에도 안전하게 rooms 배열의 하위 스크립트에 접근하여 room의 number 속성에 접근합니다.

결론

옵셔널 체이닝은 옵셔널 값에 대한 안전한 처리를 위해 매우 유용하며, 상기한 고급 사용 사례를 통해 옵셔널 체이닝이 어떻게 활용될 수 있는지 알아보았습니다.

참고: The Swift Programming Language - Optional Chaining