原文链接
隐式解包
在 iOS 项目中,如果使用 Interface Buider 构建界面,会生成这样的代码:
|
|
我们知道如果要申明 UIVivew 为 Optional 类型,
UIView? 这样写就好了。UIView!是什么意思呢? 其实这是一种特殊的 Optional,在使用时编译器会自动进行解包。这种方式被称,隐式解包。
我们在类型后面加一个叹号
!,就告诉编译器这个 Optional 处于隐式解包的状态。
|
|
最后这两行代码是等效的。当然,如果
thing 为 nil,会导致 crash。那么号称类型安全的 Swift 为什么在有了显式的强制解包还要引入这种含蓄的隐式解包写法呢?形成原因
之前在《Swift 中为什么要引入 Optional?》文中提到 Objective-C 中哨兵值引发的种种问题,Swift 的解决办法是使用安全的 Optional 类型。但是 Cocoa 框架多年来是由 Objective-C 构造的,不可避免的在很多 API 中携带了 Objective-C 语言的基因。一些 API 的参数和返回值虽然显式声明了具体的类型,但是仍然可能是 nil。如果 Swift 在自动转换过程中全部转换为 Optional,开发者在每次使用时都需要进行 Optional Binding,这是一件痛苦的事情。
所以,隐式解包这种方式这是对历史的妥协。在未来的一天,历史包袱逐渐消失,隐式解包的概念也会逐渐消亡。
目前,最常见的隐式解包就是文章开头提到的使用 Interface Buider 生成的 IBOutlet。如果没有连接 Interface Buider,使用 faceView 会导致 crash。
|
|
注意
隐式解包并不意味着「这个变量的值不会为 nil 」,而只是一种危险的捷径。
Swift 是一门进化中的语言 ,Swift 3.0 中废除了隐式解包可选类型(ImplicitlyUnwrappedOptional),并用 IUO 属性代替。理由就是隐式解包破坏了 Swift 的类型安全设计,所以要减少隐式解包的使用。
在变量类型后的
! 不再表示是隐式解包可选类型(ImplicitlyUnwrappedOptional),而是表示是 Optional,并有一个被隐式指定的属性。
评论
发表评论