Swift 中的可選值的解綁

今天在學習 The Swift Programming Language (Swift 2.2) 中的 Implicitly Unwrapped Optionals這一節的時候,對 Swift 中 !這個符號的使用產生了迷惑,所以就想寫點東西記錄一下,幫自己整理一下思路,自己也是剛學 Swift ,如果有什么問題,請多多指教。

什么是可選值,可選值就是一個變量,它可能有值,也有可能是nil,而非可選值就表明它一定是有值的。所以當可選值轉化為非可選值的時候,就涉及到一個解綁的過程。

Swift 中解綁有三種方式,其實本質都是一樣的,只是分成三種,更加清楚。首先第一種就是就是在使用過程中不停的解綁,即添加感嘆號,讓我們來看個例子:

var name: String

var name2: String? = "optional Value"

很明顯 name 是一個非可選值,而 name2 是一個可選值,接下來我們將 name2 賦值給 name

name = name2

這時候很明顯編譯器爆出了一個錯誤,提醒你需要將 name2 解綁了,所以你需要在 name2 后面加個 ! 將 name2 給解綁了。所以你如果用這種方式聲明了一個可選值類型的變量,那你在賦值給非可選值的時候,就每次都要加個感嘆號來解綁。

那有沒有改進方法呢?改進方法肯定是有的,但是如果用的不好就會付出一定的代價。例子如下:

let assumedNonoptional: String! = "An implicitly unwrapped optional string."

let implicitString: String = assumedNonoptional

這種聲明方式,assumedNonoptional 還是個可選類型的變量,這個感嘆號的作用就在與如果遇到了可選類型與非可選類型之間的轉換,編譯器會默認幫你加個感嘆號,而不用你自己每次一個個加了。雖然帶來了方便,但是這里會帶來一個造成應用崩潰的風險。assumedNonoptional是一個可選類型的值,所以也許在應用的某一處,這個變量為nil然后你又將它賦值給了一個不可變的變量,這時候編譯器自動幫你解綁了,對一個 nil 值進行解綁,應用隨之就崩潰了,爆出的錯誤就是 fatal error: unexpectedly found nil while unwrapping an Optional value 所以用這種方法一定要確保在整個使用過程中永遠是有值的。

第三種方法就是 Optional Binding。它的形式是這樣的:

if let constantName = someOptional {

? ? ?statements

} else {

? ? ?statements

}

當 someOptional 有值的時候,將值賦給 constantName 并執行 if 語句,沒有值的話執行 else。這個方法的缺點就是 constantName 的作用域只在 if 語句中,else 語句無法使用這個變量。 while 語句也是同樣的道理。

所以不同地方要使用不同的解綁方式。

+

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

推薦閱讀更多精彩內容