Swift - 可選類型

那兒_并不遠(yuǎn)

開篇

Swift基于腳本的編程語言,有著類似Ruby的優(yōu)美,Python的易用性,同時(shí)又有較強(qiáng)的運(yùn)行效率和安全性。
雖然Swift還處于一個(gè)過渡時(shí)期,但是現(xiàn)在已經(jīng)非常非常明朗,已經(jīng)是iOS開發(fā)的趨勢(shì)了。有OC開發(fā)經(jīng)驗(yàn)的同學(xué)們想要掌握Swift很容易,因?yàn)镾wift中的很多概念OC中已經(jīng)存在。
我在這里就不多寫Swift的相關(guān)語法基礎(chǔ)了,網(wǎng)上有很多優(yōu)秀的博客文章,大家可以到網(wǎng)上查看學(xué)習(xí)(這里推薦:<a >Swift中文網(wǎng)</a>)
這篇博文我會(huì)把我對(duì)Swift中的可選類型的理解寫出來,如果有不對(duì)的地方請(qǐng)大家多指教,共同進(jìn)步。

可選類型

  • 可選類型是Swift語言中新添加的對(duì)象類型,Swift可選類型好的引入體現(xiàn)了Swift語言的安全性,可以在編譯階段就檢查一些可能在運(yùn)行時(shí)才會(huì)出現(xiàn)的常見錯(cuò)誤的機(jī)制。可選類型(Optional)實(shí)質(zhì)是枚舉類型,下面是官方SDK中對(duì)Optional的封裝

public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible {
    case None
    case Some(Wrapped)
    /// Construct a `nil` instance.
    public init()
    /// Construct a non-`nil` instance that stores `some`.
    public init(_ some: Wrapped)
    /// If `self == nil`, returns `nil`.  Otherwise, returns `f(self!)`.
    @warn_unused_result
    public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U?
    /// Returns `nil` if `self` is `nil`, `f(self!)` otherwise.
    @warn_unused_result
    public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U?
    /// Create an instance initialized with `nil`.
    public init(nilLiteral: ())
}

大家可以看到Optional中有兩種類型None和Some,所謂的nil就是None,非nil就是Some,Some中的Wrapped就是我們賦予變量的原始值。

  • 語法中用 "?" 表示可選類型,"!" 表示隱式可選類型
    (1)利用 “?” 聲明變量
// 定義一個(gè)變量 
var name :String? = "Swift"
println(name) 
// 輸出為 “Swift”;
// 定義一個(gè)變量
var name :String?
println(name) 
// 輸出為 nil;

(2)利用 “!” 聲明變量

// 定義一個(gè)變量 
var name :String! = "Swift"
println(name) 
// 輸出為 “Swift”;
// 定義一個(gè)變量
var name :String!
println(name) 
// 程序報(bào)錯(cuò)

總結(jié)

對(duì) “?” 和 “!” 的理解:在我們對(duì)一個(gè)變量賦值時(shí),我們會(huì)通過Some(T)進(jìn)行裝包,也就是把我們賦予的初始值包裝到Optional中的Some下,當(dāng)我們對(duì)變量進(jìn)行取值時(shí),我們系統(tǒng)會(huì)進(jìn)行相應(yīng)的解包,從Some中取出初始值。

  • “!” 表示強(qiáng)行解包,就是告訴系統(tǒng)這個(gè)變量中有初始值,可以進(jìn)行解包,如果我們沒有對(duì)變量賦初始值的話,相當(dāng)于對(duì)一個(gè)空值(nil)進(jìn)行操作,所以程序會(huì)報(bào)錯(cuò)。
  • “?” 與上述的強(qiáng)行解包不同,它會(huì)先自動(dòng)檢查一下這個(gè)變量的初始值是否為nil,如果不是nil就進(jìn)行解包操作。
  • 我們有 “?” 聲明變量的時(shí)候如果不賦值的話,系統(tǒng)默認(rèn)賦予nil值,而用 “!” 的話就表示該變量一定是非nil類型的值。
    官方是這樣解釋的<a herf = "https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html#//apple_ref/doc/uid/TP40014097-CH21-XID_312">官方解釋</a>,如果英語這一塊沒問題的話,可以看看官方的解釋。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容