1.可选链的含义
可选链,就是在声明属性的时候,在属性的类型后面加上?问号,使得属性有一个默认值nil,这个特性非常方便,因为OC里,我们经常会需要先判断值是nil的情况和有值的情况。如果用可选链,就能免去写一堆的if(xxx = nil)
省心。
当然,如果你用?可选链,那么当你赋值的时候,编译器会让你提供默认值,例如下面
func STATUSBAR_HEIGHT() -> CGFloat {
return windowKey?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
}
2.?和!的区别
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
如果你创建一个新的 Person 实例,得益于可选项的特性,它的 residence 属性会默认初始化为 nil 。下面的代码中, john 拥有值为 nil 的 residence 属性:
let john = Person()
如果你尝试访问john的 residence 里的 numberOfRooms 属性,通过在 residence 后放一个叹号来强制展开它的值,你会触发一个运行时错误,因为 residence 根本没有值可以展开:
let roomCount = john.residence!.numberOfRooms
// 此时会报错
或者你非常肯定,不可能为nil,一定取得到值那么就直接加上!,表示强制展开,当然,你得承受可能会崩溃的后果。
3.官方文档里是这么说的
你可以通过在你希望如果可选项为非 nil 就调用属性、方法或者脚本的可选值后边使用问号( ? )来明确可选链。这和在可选值后放叹号( ! )来强制展开它的值非常类似。主要的区别在于可选链会在可选项为 nil 时得体地失败,而强制展开则在可选项为 nil 时触发运行时错误。
为了显示出可选链可以在 nil 值上调用,可选链调用的结果一定是一个可选值,就算你查询的属性、方法或者下标返回的是非可选值。你可以使用这个可选项返回值来检查可选链调用是成功(返回的可选项包含值),还是由于链中出现了 nil 而导致没有成功(返回的可选值是 nil )。