在属性、方法的可选值后面放一个问号(?),就定义了一个可选链。
当属性、方法的可选值为空时,可选链的调用只会失败,而不会触发运行时错误。如果是在可选值的后面放一个叹号(!)来强制展开值,如果可选值为空,!就会触发运行时错误,App会发生崩溃。
代码示例
定义两个类,Person 和 House:
class Person {
var house: House?
}
class House {
var numberOfRooms = 3
}
Person 实例有一个 House? 类型的可选 house 属性。
House 实例有一个 Int属性 numberOfRooms,默认值 3。
新建一个 Person实例,house 属性会默认初始化为 nil,下面代码中,mike拥有值为 nil的 house属性。
let mike = Person()
访问 mike的 house属性,如果通过叹号(!) 强制展开 house的值,就会触发一个运行时错误,因为此时的 house值为 nil。
let roomCount = mike.house!.numberOfRooms
如果 mike.house 有值不是nil,那上面的代码就会把 numberOfRooms的值赋值给 roomCount。
推荐使用可选链的方法。来获得 numberOfRooms的值,这样如果 mike.house的值为nil,也只是会调用失败,App不会奔溃。
if let roomCount = mike.house?.numberOfRooms {
print("Mike's residence has \(roomCount) room(s).")
} else {
print("Unable to retrieve the number of rooms.")
}
// 打印 “Unable to retrieve the number of rooms.”
网友评论