Swift中Optional(可選項)的理解

為什么會有Optional

OC中沒有Optional類型,OC中所有對象變量都可以為nil,因為nil是無類型的指針。在OC中字典、數組、集合都不能放入nilnil只能用在OC對象上面,變量在一定程度上來講便利性較差,但在Swift中卻不同。Swift中nil和OC中的nil是有很大區別的。在OC中nil是指向一個不存在的對象的指針,但是在Swift中,nil不是指針,只是值缺失的特殊類型,任何類型可選項都可以設置為nil。所以在Swift中,可以用可選項值為nil,來表達變量的值缺失,增加了一定的便利性。
Swift中我們在變量類型后面添加 ?來表示一個可選項,例如:

var name: String? = nil

Optional的實現

Optional其實是一個枚舉類型,我們查看標準庫中代碼可以看到

@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {

    /// The absence of a value.
    ///
    /// In code, the absence of a value is typically written using the `nil`
    /// literal rather than the explicit `.none` enumeration case.
    case none

    /// The presence of a value, stored as `Wrapped`.
    case some(Wrapped)

    /// Creates an instance that stores the given value.
    public init(_ some: Wrapped)

這個枚舉有兩個值,代碼Optional的兩層意思

  • none
    代表變量沒有值,即為nil
  • some
    代表變量有值,值為somesome包裝了實際了值

那Optional是如果得到實際的值呢,還是來看標準庫中的代碼,

    /// The wrapped value of this instance, unwrapped without checking whether
    /// the instance is `nil`.
    ///
    /// The `unsafelyUnwrapped` property provides the same value as the forced
    /// unwrap operator (postfix `!`). However, in optimized builds (`-O`), no
    /// check is performed to ensure that the current instance actually has a
    /// value. Accessing this property in the case of a `nil` value is a serious
    /// programming error and could lead to undefined behavior or a runtime
    /// error.
    ///
    /// In debug builds (`-Onone`), the `unsafelyUnwrapped` property has the same
    /// behavior as using the postfix `!` operator and triggers a runtime error
    /// if the instance is `nil`.
    ///
    /// The `unsafelyUnwrapped` property is recommended over calling the
    /// `unsafeBitCast(_:)` function because the property is more restrictive
    /// and because accessing the property still performs checking in debug
    /// builds.
    ///
    /// - Warning: This property trades safety for performance.  Use
    ///   `unsafelyUnwrapped` only when you are confident that this instance
    ///   will never be equal to `nil` and only after you've tried using the
    ///   postfix `!` operator.
    @inlinable public var unsafelyUnwrapped: Wrapped { get }

它是一個定義的get方法,Optionl通過unsafelyUnwrapped來獲取實際的值,例如:

var ddb: String? = "冬冬吧"
let ddbCount = ddb.unsafelyUnwrapped.count

這樣就得到了變量的實際值。

Optional的使用

實現一個Optional
let ddb: Optional<String> = "冬冬吧"
// var ddb: String? = "冬冬吧"

我們這樣實現的可選項,實際上和注釋部分的類型后面加?實現的是完全一樣的。

可選項的解包

可選項是不能直接使用的,需要解包后才能使用,基本上有一下解包方式

  • !強制解包,例如:
let count = ddb!.count

在強制解包前,你如果不知道它是否為nil,那你需要先對它進行非nil的判斷保護,否則強制解包一旦失敗,程序會報錯,如下代碼:

if ddb != nil {
    let count = ddb!.count
    print(count)
}

這樣即使我們使用了強制解包,但它的運行依然是安全的

  • if判斷展開,例如:
if ddb != nil {
    let count = ddb?.count
    print(count ?? 0)
}

這里我們使用a ?? b合并空值運算符的方式來解包,如果有值,則為count,如果為nil,則默認0
使用合并控制運算符有兩個條件:
1.表達式a必須是可選類型
2.表達式b必須和a的處處類型相同

  • 使用可選項綁定的方式
if let ddbStr = ddb {
    let count = ddbStr.count
    print(count)
}

使用可選項綁定來判斷可選項是否有值,如果有就賦值給臨時變量。同一個if語句可以有多個可選項綁定,用, 分開即可

小結

Optional,是”不存在“或“空”概念的加強版本。而nil則是“不存在”的基礎版本
在swift中引入optional的目的,就是將"不存在"這個概念綁定到具體的類型上。optional.nil指向的是值的“不存在”,同時表示:如有值只能是optional.some<T>中的T類型,將所有類型的值空間進行了nil的擴展。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容