Swift 可選類型詳解

概述

Swift 是一門類型安全的語言。Swift的可選類型會進行編譯檢查,防止一些常見的運行時錯誤。在 Swift 中,當我們聲明一個變量的時候,默認情況下是 非可選類型 (non-optional) ,也就是說,你必須指定一個不為 nil 的值。如果你硬是要把一個非可選類型的變量設(shè)為 nil ,那么編譯器就會報錯。
Swift中的nil,必須用可選類型接收。你可以給可選類型賦值為nil來表示他沒有值,如果你聲明一個可選常量或者變量但是沒有賦值,它們會自動被設(shè)置為 nil ,也就是說可選類型可以為nil也可以有值,非可選類型不能為nil必須有值。Swift 的 nil 和 Objective-C 中的 nil 并不一樣。在 Objective-C 中,nil 是一個指向不存在對象的指針。在 Swift 中,nil 不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態(tài)都可以被設(shè)置為 nil,不只是對象類型。

強制解包

當你確定可選類型一定包含值之后,你可以在可選的名字后面加一個感嘆號!來解包獲取值。這被稱為可選值得強制解包(forced unwrapping)
例如:

var user_name: String?
        ...
        if user_name != nil {
            print("user_name:", user_name!)
        }

可選綁定

使用可選綁定可以去辨別一個可選類型是否包含值,如果包含就把值賦給一個臨時常量或變量

if let name = user_name {
            print("user_name:", name)
        }

在 if 條件語句中使用常量和變量來創(chuàng)建一個可選綁定,僅在 if 語句的第一個分支中才能獲取到值。相反,在 guard 語句中使用常量和變量來創(chuàng)建一個可選綁定,僅在 guard 語句外且在語句后才能獲取到值,guard和let是相反的。

guard let name = user_name else {
            return
        }

隱式解析可選類型

有時候在程序架構(gòu)中,第一次被賦值之后,可以確定一個可選類型總會有值。在這種情況下,每次訪問時都不需要檢查和解析可選類型的值,因為可以安全的確定它總會有值。這種類型的可選狀態(tài)被定義為隱式解析可選類型(implicitly unwrapped optionals)。把想要用作可選的類型的后面的問號?改成感嘆號!來聲明一個隱式解析可選類型。

let user_name: String! = "user_name"
let default_name: String = user_name

一個隱式解析可選類型其實就是一個普通的可選類型,但是可以被當做非可選類型來使用,并不需要每次都使用解析來獲取可選值。你可以把隱式解析可選類型當做一個可以自動解析的可選類型。你要做的只是聲明的時候把感嘆號放到類型的結(jié)尾,而不是每次取值的時候在可選類型名字結(jié)尾放置一個!。如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型。

參考

Swift Optionals/可選類型詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容