用于这些标记的术语是Optional Chaining
。它们通常用于区分情况,例如 aproperty
是否,a是否method call
返回nil
。
Apple 的语言指南中Optional Chaining
解释的一个示例很好地说明了它们的使用目的:
首先,定义了两个名为Person
andResidence
的类:
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
} Residence instances have a single `Int` property called `numberOfRooms`, with a default value of **1**. `Person` instances
有一个类型为?的可选residence
属性。Residence
如果您创建一个新Person
实例,它的residence
属性默认初始化为nil
,因为它是可选的。john
在下面的代码中,residence
属性值为nil
:
let john = Person()
如果你试图访问numberOfRooms
这个人的属性
,通过在后面residence
放置一个感叹号residence
来强制解包它的值,你会触发一个运行时错误,因为没有residence
值可以解包:
let roomCount = john.residence!.numberOfRooms
// this triggers a runtime error
上面的代码在john.residence
具有非零值时成功,并将设置roomCount
为Int
包含适当房间数量的值。但是,此代码在is时总是会触发运行时错误,如上图所示。residence
nil
可选链接提供了另一种访问 的值的方法
numberOfRooms
。要使用可选链接,请使用问号代替感叹号:
if let roomCount = john.residence?.numberOfRooms {
print("John's residence has \(roomCount) room(s).")
} else {
print("Unable to retrieve the number of rooms.")
}
// Prints "Unable to retrieve the number of rooms."
这告诉 Swift 在可选属性上“<strong>chain”residence
并检索numberOfRooms
if residence
exists 的值。
因为访问尝试numberOfRooms
有可能失败,可选链接尝试返回一个类型的值Int?
,或“<strong>optional Int”。什么时候residence
是nil
,就像上面的例子一样,这个可选的Int
也将是nil
,以反映无法访问的事实numberOfRooms
。可选项Int
通过可选项绑定访问以解包整数并将非可选值分配给roomCount
变量。
请注意,即使numberOfRooms
是非可选的也是
Int
如此。通过可选链查询它的事实意味着调用numberOfRooms
将始终返回 anInt?
而不是Int
.
您可以将Residence
实例分配给john.residence
,使其不再具有nil
值:
john.residence = Residence()
除了上面对可选链接的一般概述之外,您还可以在 StackOverflow中查看此答案。
希望这能让您对可选链接有所了解。