이 포스팅은 The Swift Programming Language (Swift 4.1) 의 Optional Chaining 문서를 보고 이해하며 제 것으로 만들면서 정리해 놓은 문서입니다.
원문
옵셔널 체이닝을 이용하여 서브스크립트 접근하기(Accessing Subscripts Through Optional Chaining)
옵셔널 값의 서브스크립트로부터 값을 가져오거나 설정하기 위해, 옵셔널 체이닝을 사용 할 수 있고, 서브스크립트 호출이 성공하는지 확인한다.
예제는 Residence클래스에서 정의된 서브스크립트를 사용하는john.residence프로퍼티의 rooms배열에서 첫번째 방의 이름을 가져오려 시도한다.
john.residence는 현재 nil이기 때문에 서브스크립트 호출은 실패한다.
if let firstRoomName = john.residence?[0].name {
print("The first room name is \(firstRoomName).")
} else {
print("Unable to retrieve the first room name.")
}
// Prints "Unable to retrieve the first room name."
옵셔널 체이닝을 시도하는 john.residence는 옵셔널 값이기 때문에, 서브스크립트 호출에서 옵셔널 체이닝 물음표(?) 표시는 john.residence바로 뒤에 위치하며, 서브스크립트 대괄호([]) 앞에 표시한다.
john.residence?[0] = Room(name: "Bathroom")
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.") } // Prints "The first room name is Living Room."
옵셔널 타입의 서브스크립트 접근하기(Accessing Subscripts of Optional Type)
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0] += 1
testScores["Brian"]?[0] = 72
// the "Dave" array is now [91, 82, 84] and the "Bev" array is now [80, 94, 81]
위의 예에서는 testScores라는 dictionary를 정의한다.
이 dictionary에는 String 키를 Int 값의 배열에 매핑하는 두 개의 키 - 값 쌍이 들어 있다. 이 예제에서는 옵셔널 체인을 사용하여 "Dave"배열의 첫 번째 항목을 91로 설정한다.
"Bev"배열의 첫 번째 항목을 1 씩 증가시킨다.
"Brian"키에 대한 배열의 첫 번째 항목을 설정하려고 한다. testScores dictionary에는 "Dave"및 "Bev"에 대한 키가 있기 때문에 처음 두 번의 호출이 성공한다. testScores dictionary에 "Brian"에 대한 키가 없으므로 세 번째 호출이 실패한다.
체이닝의 여러 단계 연결하기(Linking Multiple Levels of Chaining)
모델 내에서 프로퍼티, 메소드, 서브스크립에 옵셔널 체이닝을 여러 단계로 함께 연결 할 수 있다. 하지만, 값을 반환하기 위해, 옵셔널 체이닝의 여러 단계에 더 이상 옵셔널 단계를 추가하지 않는다.
//아래는 옵셔널 체이닝 residence와 address의 두 레벨인 옵셔널 체이닝이 있다.
if let johnsStreet = john.residence?.address?.street {
print("John's street name is \(johnsStreet).")
} else {
print("Unable to retrieve the address.")
}
// Prints "Unable to retrieve the address."
let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence?.address = johnsAddress
if let johnsStreet = john.residence?.address?.street {
print("John's street name is \(johnsStreet).")
} else {
print("Unable to retrieve the address.")
}
// Prints "John's street name is Laurel Street."
옵셔널 값을 반환하는 메소드 체이닝(Chaining on Methods with Optional Return Values)
if let firstRoomName = john.residence?[0].name {
print("The first room name is \(firstRoomName).")
} else {
print("Unable to retrieve the first room name.")
}
// Prints "Unable to retrieve the first room name."
if let buildingIdentifier = john.residence?.address?.buildingIdentifier() {
print("John's building identifier is \(buildingIdentifier).")
}
// Prints "John's building identifier is The Larches."
//이 메소드의 반환 값에 추가적으로 옵셔널 체이닝을 수행하는 경우, 옵셔널 체이닝의 물음표(?)는 메소드의 괄호(())뒤에 표시한다.
if let beginsWithThe =
john.residence?.address?.buildingIdentifier()?.hasPrefix("The") {
if beginsWithThe {
print("John's building identifier begins with \"The\".")
} else {
print("John's building identifier does not begin with \"The\".")
}
}
// Prints "John's building identifier begins with "The"."
'Mobile > ios & swift' 카테고리의 다른 글
[ios] iphone 무선 디버깅 연결하기 (0) | 2018.07.02 |
---|---|
[ios] iPhone is busy. Preparing debugger support for 에러 문구 (0) | 2018.07.01 |
[Swift 4] 타입 캐스팅 (Type Casting) (0) | 2018.04.08 |
[Swift 4] Optional Chaining(3) - 옵셔널 체이닝을 이용하여 메소드 호출하기 (0) | 2018.03.20 |
[Swift 4] Optional Chaining(2) - 옵셔널 체이닝을 이용하여 프로퍼티 접근하기 (0) | 2018.03.19 |
[Swift 4] Optional Chaining(1) - 강제 언래핑 대안으로서의 옵셔널 체이닝 (0) | 2018.03.19 |
[Swift 4] Swift 둘러보기 (0) | 2017.12.04 |