17.5. 通过可选链式调用访问下标

通过可选链式调用,我们可以在一个可选值上访问下标,并且判断下标调用是否成功。

注意

通过可选链式调用访问可选值的下标时,应该将问号放在下标方括号的前面而不是后面。可选链式调用的问号一般直接跟在可选表达式的后面。

下面这个例子用下标访问 john.residence 属性存储的 Residence 实例的 rooms 数组中的第一个房间的名称,因为 john.residencenil,所以下标调用失败了:

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 是可选值。

类似的,可以通过下标,用可选链式调用来赋值:

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

这次赋值同样会失败,因为 residence 目前是 nil

如果你创建一个 Residence 实例,并为其 rooms 数组添加一些 Room 实例,然后将 Residence 实例赋值给 john.residence,那就可以通过可选链和下标来访问数组中的元素:

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 类型的键的下标,可以在下标的结尾括号后面放一个问号来在其可选返回值上进行可选链式调用:

var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0] += 1
testScores["Brian"]?[0] = 72
// "Dave" 数组现在是 [91, 82, 84],"Bev" 数组现在是 [80, 94, 81]

上面的例子中定义了一个 testScores 数组,包含了两个键值对,分别把 String 类型的键映射到一个 Int 值的数组。这个例子用可选链式调用把 "Dave" 数组中第一个元素设为 91,把 "Bev" 数组的第一个元素 +1,然后尝试把 "Brian" 数组中的第一个元素设为 72。前两个调用成功,因为 testScores 字典中包含 "Dave""Bev" 这两个键。但是 testScores 字典中没有 "Brian" 这个键,所以第三个调用失败。