可选链式调用是一种可以在当前值可能为 nil
的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会成功;如果可选值是 nil
,那么调用将返回 nil
。多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为 nil
,整个调用链都会失败,即返回 nil
。
定义可选链:
var residence: Residence?
? 与 ! 区别:
通过在想调用的属性、方法,或下标的可选值后面放一个问号(?
),可以定义一个可选链。这一点很像在可选值后面放一个叹号(!
)来强制解包它的值。它们的主要区别在于当可选值为空时可选链式调用只会调用失败,然而强制解包将会触发运行时错误。
class Residence {
// 普通变量
var rooms: [Room] = []
// 计算属性
var numberOfRooms: Int {
return rooms.count
}
//下标
subscript(i: Int) -> Room {
get {
return rooms[i]
}
set {
rooms[i] = newValue
}
}
func printNumberOfRooms() {
print("The number of rooms is \(numberOfRooms)")
}
//可选链
var address: Address?
}
可选链一般可用于和if等判断条件流程结合使用