🔥 옵셔널 체이닝을 통한 서브스크립트 접근

409자
6분

옵셔널 값에서 서브스크립트를 사용하여 값을 가져오거나 설정하고, 해당 서브스크립트 호출이 성공했는지 확인하기 위해 옵셔널 체이닝을 사용할 수 있습니다.

아래 예제는 Residence 클래스에 정의된 서브스크립트를 사용하여 john.residence 속성의 rooms 배열에서 첫 번째 방의 이름을 가져오려고 합니다. 현재 john.residencenil이기 때문에 서브스크립트 호출은 실패합니다:

swift
if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
// "Unable to retrieve the first room name."이 출력됩니다.
swift
if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
// "Unable to retrieve the first room name."이 출력됩니다.

이 서브스크립트 호출에서 옵셔널 체이닝 물음표는 서브스크립트 대괄호 앞에 있는 john.residence 바로 뒤에 위치합니다. 왜냐하면 john.residence가 옵셔널 체이닝을 시도하는 옵셔널 값이기 때문이죠.

유사하게, 옵셔널 체이닝을 통해 서브스크립트로 새로운 값을 설정할 수도 있습니다:

swift
john.residence?[0] = Room(name: "Bathroom")
swift
john.residence?[0] = Room(name: "Bathroom")

이 서브스크립트 설정 시도 역시 residence가 현재 nil이기 때문에 실패합니다.

만약 실제 Residence 인스턴스를 생성하고 john.residence에 할당하며, rooms 배열에 하나 이상의 Room 인스턴스가 있다면, 옵셔널 체이닝을 통해 Residence 서브스크립트를 사용하여 rooms 배열의 실제 항목에 접근할 수 있습니다:

swift
let johnsHouse = Residence()
johnsHouse.rooms.append(Room(name: "Living Room"))
johnsHouse.rooms.append(Room(name: "Kitchen"))
john.residence = johnsHouse
 
if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
// "The first room name is Living Room."이 출력됩니다.
swift
let johnsHouse = Residence()
johnsHouse.rooms.append(Room(name: "Living Room"))
johnsHouse.rooms.append(Room(name: "Kitchen"))
john.residence = johnsHouse
 
if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
// "The first room name is Living Room."이 출력됩니다.

옵셔널 타입의 서브스크립트 접근

만약 서브스크립트가 Swift의 Dictionary 타입의 키 서브스크립트와 같이 옵셔널 타입의 값을 반환한다면, 서브스크립트의 닫는 대괄호 뒤에 물음표를 붙여 반환값의 옵셔널을 체이닝합니다:

swift
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91 // "Dave" 배열이 [91, 82, 84]로 업데이트됩니다.
testScores["Bev"]?[0] += 1 // "Bev" 배열이 [80, 94, 81]로 업데이트됩니다.
testScores["Brian"]?[0] = 72 // 아무 변화도 없습니다.
swift
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91 // "Dave" 배열이 [91, 82, 84]로 업데이트됩니다.
testScores["Bev"]?[0] += 1 // "Bev" 배열이 [80, 94, 81]로 업데이트됩니다.
testScores["Brian"]?[0] = 72 // 아무 변화도 없습니다.

위의 예제는 testScores라는 딕셔너리를 정의하는데, 이는 String 키를 Int 값의 배열에 매핑하는 두 개의 키-값 쌍을 포함하고 있습니다. 예제에서는 옵셔널 체이닝을 사용하여 "Dave" 배열의 첫 번째 항목을 91로 설정하고, "Bev" 배열의 첫 번째 항목을 1 증가시키며, "Brian" 키의 배열에서 첫 번째 항목을 설정하려고 시도합니다.

처음 두 호출은 testScores 딕셔너리에 "Dave""Bev" 키가 포함되어 있기 때문에 성공합니다. 세 번째 호출은 testScores 딕셔너리에 "Brian" 키가 포함되어 있지 않기 때문에 실패하게 됩니다.

이렇게 옵셔널 체이닝을 사용하면 안전하게 서브스크립트에 접근하고 값을 설정할 수 있습니다. 옵셔널 체이닝은 Swift에서 매우 강력하고 유용한 기능으로, 옵셔널 값을 다룰 때 코드의 가독성과 안정성을 크게 향상시켜 줍니다.

아래는 옵셔널 체이닝을 사용한 서브스크립트 접근의 프로세스를 나타내는 다이어그램입니다:

lecture image

이 다이어그램은 옵셔널 체이닝을 사용할 때 어떤 과정을 거치는지 명확하게 보여줍니다. 옵셔널 값이 nil이 아니라면 서브스크립트 호출이 이루어지고, 호출이 성공하면 래핑된 값이 반환되며, 실패하면 nil이 반환됩니다. 이런 과정을 통해 옵셔널 값을 안전하게 처리할 수 있게 되는 것이죠.

YouTube 영상

채널 보기
리더 펑터 - 함수도 펑터다! | 프로그래머를 위한 카테고리 이론
Zod로 스키마 유효성 검사 구현하기 | NestJS 가이드
NestJS 파이프가 뭔가요? 컨트롤러를 보호하는 방법 | NestJS 가이드
NestJS 전역 에러 처리 | NestJS 가이드
존 매카시가 들려주는 인공지능의 탄생 이야기
변환 파이프로 컨트롤러 코드 깔끔하게 만들기 | NestJS 가이드
NestJS 필터 바인딩 - Method, Controller, Global Scope 비교 | NestJS 가이드
클로드 섀넌이 들려주는 정보 이론 이야기