可以通过连接多个可选链式调用在更深的模型层级中访问属性、方法以及下标。然而,多层可选链式调用不会增加返回值的可选层级。
也就是说:
- 如果你访问的值不是可选的,可选链式调用将会返回可选值。
- 如果你访问的值就是可选的,可选链式调用不会让可选返回值变得“更可选”。
因此:
- 通过可选链式调用访问一个
Int
值,将会返回Int?
,无论使用了多少层可选链式调用。 - 类似的,通过可选链式调用访问
Int?
值,依旧会返回Int?
值,并不会返回Int??
。
下面的例子尝试访问 john
中的 residence
属性中的 address
属性中的 street
属性。这里使用了两层可选链式调用,residence
以及 address
都是可选值:
if let johnsStreet = john.residence?.address?.street {
print("John's street name is \(johnsStreet).")
} else {
print("Unable to retrieve the address.")
}
// 打印“Unable to retrieve the address.”
john.residence
现在包含一个有效的 Residence
实例。然而,john.residence.address
的值当前为 nil
。因此,调用 john.residence?.address?.street
会失败。
需要注意的是,上面的例子中,street
的属性为 String?
。john.residence?.address?.street
的返回值也依然是 String?
,即使已经使用了两层可选链式调用。
如果为 john.residence.address
赋值一个 Address
实例,并且为 address
中的 street
属性设置一个有效值,我们就能过通过可选链式调用来访问 street
属性:
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.")
}
// 打印“John's street name is Laurel Street.”
在上面的例子中,因为 john.residence
包含一个有效的 Address
实例,所以对 john.residence
的 address
属性赋值将会成功。