可选链
可选值的缺点
- 使用可选值有时会让人感到有点笨拙,所有的解包和检查会变得如此繁重,以至于会让你想要 丢几个感叹号上去强制解包,好让你能继续工作下去。但是请小心:如果你强制解包一个没有 值的可选值,你的代码就崩了。为了解决这个缺点,Swift 引入两个特性,一是合并空值运算 符,二是可选链。
可选链
- 可选链是一个调用和查询可选属性、方法和下标的过程,它可能为 nil 。如果可选项包含值,属 性、方法或者下标的调用成功;如果可选项是 nil ,属性、方法或者下标的调用会返回 nil 。多 个查询可以链接在一起,如果链中任何一个节点是 nil ,那么整个链就会得体地失败。
可选链代替强制展开
- 你可以通过在你希望如果可选项为非 nil 就调用属性、方法或者脚本的可选值后边使用问号( ? ) 来明确可选链。这和在可选值后放叹号( ! )来强制展开它的值非常类似。主要的区别在于可选链 会在可选项为 nil 时得体地失败,而强制展开则在可选项为 nil 时触发运行时错误。
- 为了显示出可选链可以在 nil 值上调用,可选链调用的结果一定是一个可选值,就算你查询的属 性、方法或者下标返回的是非可选值。你可以使用这个可选项返回值来检查可选链调用是成功 (返回的可选项包含值),还是由于链中出现了 nil 而导致没有成功(返回的可选值是 nil )。
-
另外,可选链调用的结果与期望的返回值类型相同,只是包装成了可选项。通常返回 Int 的属性通 过可选链后会返回一个 Int? 。
通过可选链调用方法
-
函数和方法没有返回类型就隐式地指明为 Void 类型。意思是说它们返回一个 () 的值或者是一个 空的元组。
-
如果你尝试通过可选链来设置属性也是一样的。上边通过可选链访问属性中的例子尝试设置 address 值给 john.residence ,就算是 residence 属性是 nil 也行。任何通过可选链设置属性 的尝试都会返回一个 Void? 类型值,它允许你与 nil 比较来检查属性是否设置成功:
通过可选链访问下标
-
通过可选链访问下标你可以使用可选链来给可选项下标取回或设置值,并且检查下标的调用是否 成功。
链的多层连接
- 你可以通过连接多个可选链来在模型中深入访问属性、方法以及下标。总之,多层可选链不会给返回的值添加多层的 可选性。
也就是说:
- 如果你访问的值不是可选项,它会因为可选链而变成可选项;
- 如果你访问的值已经是可选的,它不会因为可选链而变得更加可选。
因此:
- 如果你尝试通过可选链取回一个 Int 值,就一定会返回 Int? ,不论通过了多少层的可选链;
- 类似地,如果你尝试通过可选链访问 Int? 值, Int? 一定就是返回的类型,无论通过了多少层的可选链。
用可选返回值链接方法
-
可以通过可选链来调用返回可选类型的方法,并且如果需要的话可以继续对方法的返回值进行链接。
KVC/KVO
KVC
- 从 Swift4 开始,类和 struct 都支持 KVC。
-
继承自 NSObject 的类,标记为 @objc 的属性可以使用 - setValue(_:forKey) 非继承自 NSObject 的类和结构体,使用索引+参数值
KVO
- 只有NSObject才能支持KVO
-
要观察的属性必须使用 @objc dynamic 修饰。