首先,定义了两个名为Person 和Residence 的类:
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 具有非nil 值时,上述代码成功
并将roomCount 设置为包含适当的Int 值
房间的数量。但是,此代码始终会触发 运行时
当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 在可选的 residence 属性上“chain”
如果存在residence,则检索numberOfRooms 的值。
因为访问 numberOfRooms 的尝试可能会
失败,可选的链接尝试返回 Int? 类型的值,或者
“可选整数”。当residence 为nil 时,如示例
上面,这个可选的Int也将是nil,以反映事实
无法访问numberOfRooms。可选的Int
通过可选绑定访问以解包整数并分配
roomCount 变量的非可选值。
请注意,即使numberOfRooms 是一个非可选,这也是正确的
Int。通过可选链查询它的事实意味着
对numberOfRooms 的调用将始终返回Int?
Int.
您可以将Residence 实例分配给john.residence,以便它
不再有 nil 值:
john.residence = Residence()