目录
通过可选链式调用访问属性(?访问属性当属性为nil时,?的属性也是无法被赋上值)
访问可选类型的下标 (?表示在? 前的值是否为nil,为nil则不向下执行,类似JS)
在方法的可选返回值上进行可选链式调用(方法后的圆括号后加?)
Swift 的可选链式调用和 Objective-C 中向 nil
发送消息有些相像,但是 Swift 的可选链式调用可以应用于任意类型,并且能检查调用是否成功。
使用可选链式调用代替强制展开(使用?而非!)
通过在想调用的属性、方法,或下标的可选值后面放一个问号(?
),可以定义一个可选链。
区别:当可选值为空时可选链式调用只会调用失败,然而强制展开将会触发运行时错误。
可选链式调用和强制展开的不同。示例
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
let john = Person()
使用 ! 强制展开因为这时 residence 没有可以展开的值
let roomCount = john.residence!.numberOfRooms // 这会引发运行时错误
可选链式调用
if let roomCount = john.residence?.numberOfRooms { 有值会取到值无值返回nil
print("John's residence has \(roomCount) room(s).")
} else {
print("Unable to retrieve the number of rooms.")
}
打印“Unable to retrieve the number of rooms.”
john.residence = Residence() //这样它就不再是 nil 了:
john.residence 现在包含一个实际的 Residence 实例,而不再是 nil
// 打印“John's residence has 1 room(s).”
为可选链式调用定义模型类
使用可选链式调用可以调用多层属性、方法和下标。可以在复杂的模型中向下访问各种子属性,并且判断能否访问子属性的属性、方法和下标
class Residence {
var rooms = [Room]()
numberOfRooms 被实现为计算型属性
var numberOfRooms: Int {
return rooms.count
}
定义下标:下标来访问 rooms 数组中指定位置的元素(读/写)
subscript(i: Int) -> Room {
get {
return rooms[i]
}
set {
rooms[i] = newValue
}
}
func printNumberOfRooms() {
print("The number of rooms is \(numberOfRooms)")
}
var addr