Swift中Optional(可選項)的理解

為什么會有Optional

OC中沒有Optional類型乱灵,OC中所有對象變量都可以為nil溯饵,因為nil是無類型的指針。在OC中字典背镇、數(shù)組咬展、集合都不能放入nil花履,nil只能用在OC對象上面,變量在一定程度上來講便利性較差挚赊,但在Swift中卻不同诡壁。Swift中nil和OC中的nil是有很大區(qū)別的。在OC中nil是指向一個不存在的對象的指針荠割,但是在Swift中妹卿,nil不是指針,只是值缺失的特殊類型蔑鹦,任何類型可選項都可以設(shè)置為nil夺克。所以在Swift中,可以用可選項值為nil嚎朽,來表達變量的值缺失铺纽,增加了一定的便利性。
Swift中我們在變量類型后面添加 ?來表示一個可選項哟忍,例如:

var name: String? = nil

Optional的實現(xiàn)

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的使用

實現(xiàn)一個Optional
let ddb: Optional<String> = "冬冬吧"
// var ddb: String? = "冬冬吧"

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

可選項的解包

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

  • !強制解包,例如:
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語句可以有多個可選項綁定张足,用, 分開即可

小結(jié)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖韩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疫铜,更是在濱河造成了極大的恐慌茂浮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳咕,死亡現(xiàn)場離奇詭異席揽,居然都是意外死亡,警方通過查閱死者的電腦和手機囱井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門驹尼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣避,“玉大人庞呕,你說我怎么就攤上這事〕膛粒” “怎么了住练?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長愁拭。 經(jīng)常有香客問我讲逛,道長,這世上最難降的妖魔是什么岭埠? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任盏混,我火速辦了婚禮,結(jié)果婚禮上惜论,老公的妹妹穿的比我還像新娘许赃。我一直安慰自己,他們只是感情好馆类,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布混聊。 她就那樣靜靜地躺著,像睡著了一般乾巧。 火紅的嫁衣襯著肌膚如雪句喜。 梳的紋絲不亂的頭發(fā)上预愤,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音咳胃,去河邊找鬼植康。 笑死,一個胖子當著我的面吹牛展懈,可吹牛的內(nèi)容都是我干的向图。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼标沪,長吁一口氣:“原來是場噩夢啊……” “哼榄攀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起金句,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檩赢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后违寞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贞瞒,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年趁曼,在試婚紗的時候發(fā)現(xiàn)自己被綠了军浆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡挡闰,死狀恐怖乒融,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摄悯,我是刑警寧澤赞季,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站奢驯,受9級特大地震影響申钩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘪阁,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一撒遣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧管跺,春花似錦义黎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春火的,著一層夾襖步出監(jiān)牢的瞬間壶愤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工馏鹤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留征椒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓湃累,卻偏偏與公主長得像勃救,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子治力,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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