Swift可選項的判斷

前提

使用可選項的時候毫目,對應的一般要使用!來強行解包蔬啡,大多數(shù)情況下使用!是有風險的,一不小心就會崩镀虐,比如:

 func demo(x: Int?, y: Int?){
    print(x! + y!)
}

然后調(diào)用的時候是這樣的demo(x:10,y:100)箱蟆,這樣一般沒有錯誤的,但是當外面?zhèn)鞯膮?shù)是nil的話刮便,那么就會報錯空猜,自己可以試試。所以有些人就用if來解決問題恨旱,代碼如下:

if x != nil && y != nil {
        print(x! + y!)
    }else{
        print("x或者y為nil")
    }

這么寫不會出錯辈毯,但是如果直接使用if,一不小心會讓代碼很丑陋搜贤。有興趣的可以去王巍的書中找找看谆沃,有用if的這么判斷,你只會覺得很蛋疼仪芒。
接著來用第二種方法來做判斷:

 func demo1(x: Int?, y: Int?) {
    /**
     ??是一個簡單的三目
     - 如果有值唁影,使用值
     - 如果沒有值,用??后面的值替代
    */
    print((x ?? 0) + (y ?? 0))
    
    let name:String? = nil//= "老王"
    
    print((name ?? "") + "你好")
    
    //'??'操作符號的優(yōu)先級低掂名,在使用的時候据沈,最好加上()包一下
    print(name ?? "" + "你好")//如果上面的string = 老王,那么這兒打印的就是老王饺蔑,這個是個三目锌介,name為空的話打印`+你好`。
    
}

這種方法寫出來就好看多了膀钠,也是很常用的掏湾。
然后使用第三種方法:if let / var

func demo2() {
    let oName: String? = "老王"
    let oAge: Int? = 10
    
    if oName != nil && oAge != nil {
        print(oName! + String(oAge!))
    }
    
    //if let連用,判斷對象的值是否為nil肿嘲,{}內(nèi)一定有值融击,可以直接使用,不需要解包
    //if var連用雳窟,{}可以對值直接進行修改
    if var name = oName, let age = oAge
    {
        name = "老李"
        //進入分支之后尊浪,name和age一定有值匣屡,不需要解包
        //name和age的作用域僅在{}中
        print(name + String(age))
    }else{
        print("name 或 age 為 nil")
    }
}

緊接著來使用第四種方法:guard

// guard let 和if剛好相反
func demo3(){
    let oName: String? = "老王"
    let oAge: Int? = 10
    //guard let守護一定有值,如果沒有直接返回
    guard let name = oName,let age = oAge else {
        print("姓名或者年齡為nil")
        return
    }
    //代碼行至此拇涤,name和age一定有值
    //通常哦按段是否有值之后捣作,會做具體的邏輯實現(xiàn),通常代碼多
    //如果用if let憑空多了一層分支,guard降低分支層次的辦法
    //guard是swift2.0推出的
    print (name + String(age))
}

最后說說guard let & if let的技巧:

 func demo4(name: String?,age:Int?){
    
    //非空的name和age僅在{}內(nèi)有效 
    if let name = name,let age = age {
        print (name + String(age))
        print("--------------")
    }
    
    //guard let & if let的技巧
    //使用同名的變量接收值,在后續(xù)使用的都是非空值鹅士,不需要解包
    //好處券躁,可以避免起名字的煩惱
    guard let name = name, let age = age else {
        print("姓名或者年齡為nil")
        return
    }
    
    print (name + String(age))
//        let oName: String? = "老王"
//        let oAge: Int? = 10
}

總結(jié)

在使用可選項的時候,往往需要解包掉盅,和文中舉的例子一樣也拜,如果你傳個nil的時候就會崩潰,所以需要判斷可選項的值趾痘,總共介紹了四種方法慢哈,推薦使用2,3永票,4三種方法卵贱!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侣集,隨后出現(xiàn)的幾起案子键俱,更是在濱河造成了極大的恐慌,老刑警劉巖肚吏,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件方妖,死亡現(xiàn)場離奇詭異,居然都是意外死亡罚攀,警方通過查閱死者的電腦和手機党觅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斋泄,“玉大人杯瞻,你說我怎么就攤上這事§牌” “怎么了魁莉?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長募胃。 經(jīng)常有香客問我旗唁,道長,這世上最難降的妖魔是什么痹束? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任检疫,我火速辦了婚禮,結(jié)果婚禮上祷嘶,老公的妹妹穿的比我還像新娘屎媳。我一直安慰自己夺溢,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布烛谊。 她就那樣靜靜地躺著风响,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丹禀。 梳的紋絲不亂的頭發(fā)上状勤,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音湃崩,去河邊找鬼荧降。 笑死,一個胖子當著我的面吹牛攒读,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辛友,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼薄扁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了废累?” 一聲冷哼從身側(cè)響起邓梅,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邑滨,沒想到半個月后日缨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掖看,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年匣距,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哎壳。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡毅待,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出归榕,到底是詐尸還是另有隱情尸红,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布刹泄,位于F島的核電站外里,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏特石。R本人自食惡果不足惜盅蝗,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望县匠。 院中可真熱鬧风科,春花似錦撒轮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至故痊,卻和暖如春顶瞳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愕秫。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工慨菱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戴甩。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓符喝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甜孤。 傳聞我的和親對象是個殘疾皇子协饲,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 126.析構(gòu)器 在一個類實例銷毀前,一個析構(gòu)器會立即調(diào)用。使用deinit 關(guān)鍵字來表示析構(gòu)器, 跟構(gòu)造器寫法類似...
    無灃閱讀 779評論 0 4
  • Swift 介紹 簡介 Swift 語言由蘋果公司在 2014 年推出缴川,用來撰寫 OS X 和 iOS 應用程序 ...
    大L君閱讀 3,176評論 3 25
  • 注: Copy 自 cocoachina 英文原文:Swift Style Guide 翻譯作者:碼農(nóng)網(wǎng) – 豆照...
    Mid_Chan閱讀 697評論 0 0
  • 關(guān)于 Swift 重要這個文檔所包含的準備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的茉稠。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,275評論 1 27
  • 是一位縱橫了兩萬里的嚴厲 教師 卻總管不住里面的花 在外面紅 是一口加蓋了黑鐵鍋蓋的 蒸鍋 卻總擋不住里面的饅頭 ...
    勒尤閱讀 161評論 0 1