隱式解包 Optional

/*

相對于普通的 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 中的控件對應可有可無的時候,這是需要改成 ? 避免崩潰

*/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容