那兒_并不遠(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>,如果英語這一塊沒問題的話,可以看看官方的解釋。