可以通过连接多个可选链式调用在更深的模型层级中访问属性、方法以及下标。然而,多层可选链式调用不会增加返回值的可选层级。
也就是说:
- 如果你访问的值不是可选的,可选链式调用将会返回可选值。
- 如果你访问的值就是可选的,可选链式调用不会让可选返回值变得“更可选”。
因此:
- 通过可选链式调用访问一个
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
属性赋值将会成功。
下一节:Swift 是一种非常好的编写软件的方式,无论是手机,台式机,服务器,还是其他运行代码的设备。它是一种安全,快速和互动的编程语言,将现代编程语言的精华和苹果工程师文化的智慧,以及来自开源社区的多样化贡献结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,鱼与熊掌兼得。