/*
相对于普通的 Optional 值,在 Swift 中我们还有一种特殊的 Optional, 在对它的成员或者方法进行访问时,编译器会帮助我们自动进行解包,这就是 ImplicitlyUmwrappedOptional 在声明的时候,我们可以通过在类型后面加一个感叹号(!)这个语法糖来告诉编译器我们需要一个可以隐式解包的 Optional值
*/
class MyClass {
func foo(){ }
}
var maybeObject: MyClass!
/*
需要明确的是,隐式解包的 Optional 本质上与普通的 Optional值并没有任何不同,只是我们队这类变量的成员或者方法访问的时候,编译器会自动为我们在后面插入解包符号 !也就是说,对于下面的两种写法是等效的
*/
var maybeObject1: MyClass! = MyClass()
maybeObject1!.foo()
maybeObject1.foo()
/*
我们知道, 如果 maybeObject1 是普通 Optional 的话,我们就只能通过第一种显式的加感叹号的写法,这能提醒我们也许应该使用 if let 的 Optional Binding 的形式来处理。而对于隐式解包来说,后一种写法看起来就好像我们操作的 maybeObject1 确实是 MyClass 类的实例,不需要对其检查就可以使用(当然实际上这不是真的).为什么一向以安全主城的swift中会存在隐式解包并可以写出让人误认为能直接访问的这种危险写法呢 ?
因为 Object-C 中向 nil 发消息并不会有什么不良影响。
这也是为什么 Object-C 函数在 Swift代码中调用,返回值大多被处理为 Optional 类型的原因
注意:
隐式解包并不以为这‘这个变量不会是nil’,只是简单但是危险的。
常见的隐式解包比如 拖控件的 IBOutlet
*/
// @IBOutlet weak var button: UIButton!
/*
如果没有 IB 连线,就会导致崩溃。
如果一个 xib 中的控件对应可有可无的时候,这是需要改成 ? 避免崩溃
*/