swift 中的 ??

引言

最近有幸參加公司的iOS招聘面試祈秕,發(fā)現很多3年左右工作經驗的工程師對 swift 還停留在想要去了解的階段肠槽,一些是由于公司項目的原因,一些是因為個人原因姑荷,但 swift 4.0 都已經出了耐量,還在抱著觀望的心態(tài)實在不像一個做技術的人應有的態(tài)度飞蚓,所以最近想寫一些跟 swift 相關的知識點,既作為自己對知識點的整理和保存廊蜒,也希望能幫助到一些正在學習 swift 的小伙伴~~~

概念

空合運算符趴拧,當然這個運算符并不是 swift 首創(chuàng),早在 C#山叮,Perl著榴,PHP7.0.0 等均有此運算符。

作用

這是一個非常有用而且常用的操作符屁倔,可以用來快速對 nil 進行條件判空脑又,使代碼看起來更加簡潔。

  • 使用之前
// 寫法一:可選綁定(Optional Binding)
var username = ""
if let name = inputName {
    username = name
} else {
    username = "Guest"
}

// 寫法二:三目運算符(ternary operator)
let username = inputName != nil ? inputName! : "Guest"

  • 使用之后
let username = inputName ?? "Guest" 

事實上 a ?? b 表示將對可選類型a進行為空判斷锐借,如果a包含一個值问麸,就進行解封,否則就返回一個默認值b钞翔。
注意:表達式 a 必須是 Optional 類型严卖。默認值 b 的類型必須要和 a 存儲值的類型保持一致。

定義

public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?
  • @autoclosure

@autoclosure作用就是把一句表達式自動地封裝成一個閉包布轿,@autoclosure并不支持帶有輸入參數的寫法哮笆,只能使用類似 () -> T 的參數才能使用這個特性俺亮。所以寫接受 @autoclosure 的方法時還需謹慎,在容易產生誤解的時候疟呐,還是建議使用完整的閉包。

了解了 @autoclosure 之后 我們來猜一下 ?? 的實現

  • 實現
public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T {
    switch optional {
        case .Some(let value):
            return value
        case .None:
            return defaultValue()
    }
}

到這里我想除了 ?? 的實現之外东且,對 Optional 的實現應該也有所了解了

enum Optional<T> : Reflectable, NilLiteralConvertible {
    case None
    case Some(T)
    init()
    init(_ some: T)
    ...
}

當 Optional 沒有值時启具,返回的 nil 其實就是 Optional.None,即沒有值珊泳。除了 None 以外鲁冯,還有一個 Some,當有值時就是被 Some(T) 包裝的真正的值色查,所以拆包其實就是將Some里面的值取出來薯演。

可能有些朋友會有疑問為什么這里要使用 @autoclosure,直接將 T 作為參數返回不行嗎秧了?這正是 @autoclosure 一個最值得稱贊的地方跨扮。如果我們直接使用 T,那么意味著 ?? 操作符真正取值之前验毡,我們就必須準備好一個默認值衡创,這個默認值的準備和計算會降低性能。但如果 optional 不是 nil晶通,就完全不需要這個默認值璃氢,會直接返回 optional 解包后的值。這種情況下默認值的準備就屬于過度開銷了狮辽。使用 @autoclosure 就是將默認值的計算推遲到 optional 確定為 nil 之后一也。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喉脖,隨后出現的幾起案子椰苟,更是在濱河造成了極大的恐慌,老刑警劉巖动看,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尊剔,死亡現場離奇詭異,居然都是意外死亡菱皆,警方通過查閱死者的電腦和手機须误,發(fā)現死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仇轻,“玉大人京痢,你說我怎么就攤上這事∨竦辏” “怎么了祭椰?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵臭家,是天一觀的道長。 經常有香客問我方淤,道長钉赁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任携茂,我火速辦了婚禮你踩,結果婚禮上,老公的妹妹穿的比我還像新娘讳苦。我一直安慰自己带膜,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布鸳谜。 她就那樣靜靜地躺著膝藕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咐扭。 梳的紋絲不亂的頭發(fā)上芭挽,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音蝗肪,去河邊找鬼览绿。 笑死,一個胖子當著我的面吹牛穗慕,可吹牛的內容都是我干的饿敲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼逛绵,長吁一口氣:“原來是場噩夢啊……” “哼怀各!你這毒婦竟也來了?” 一聲冷哼從身側響起术浪,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓢对,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胰苏,有當地人在樹林里發(fā)現了一具尸體硕蛹,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年硕并,在試婚紗的時候發(fā)現自己被綠了法焰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡倔毙,死狀恐怖埃仪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情陕赃,我是刑警寧澤卵蛉,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布颁股,位于F島的核電站,受9級特大地震影響傻丝,放射性物質發(fā)生泄漏甘有。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一葡缰、第九天 我趴在偏房一處隱蔽的房頂上張望梧疲。 院中可真熱鬧,春花似錦运准、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至米者,卻和暖如春韭畸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔓搞。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工胰丁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喂分。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓锦庸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒲祈。 傳聞我的和親對象是個殘疾皇子甘萧,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容

  • 對各種值為"空"的情況處理不當,幾乎是所有Bug的來源梆掸。 在我們的例子里扬卷,盡管tmp的值是nil,但調用tmp的r...
    AKyS佐毅閱讀 10,528評論 1 13
  • 類型 在Swift中酸钦,有兩種類型:命名型類型和復合型類型怪得。命名型類型是在定義時可以給定的特定名字的類型。命名型類型...
    silly鴻閱讀 699評論 0 0
  • 關于 Swift 重要這個文檔所包含的準備信息, 是關于開發(fā)的 API 和技術的卑硫。這個信息可能會改變, 根據這個文...
    無灃閱讀 4,316評論 1 27
  • 在實際編程中徒恋,很多時候,我們都需要使用比Int欢伏,String這類簡單類型更復雜的類型因谎,例如,需要兩個Double表...
    AKyS佐毅閱讀 1,906評論 0 6
  • 轉載自:http://segmentfault.com/a/1190000000533936一般我們在一下兩種情況...
    若水V_V閱讀 326評論 0 1