Swift中可選值判斷 (強(qiáng)解包和??運(yùn)算符)

1. 強(qiáng)解包和?? 運(yùn)算符來解決可選值的判斷

let url = URL(string: "http://www.baidu.com")
// 通過快速推倒(option + 鼠標(biāo)左鍵): 可以知道, url為 let url: URL?  可選值類型, 因?yàn)檫@個(gè)url可能初始化成功, 但是也可能失敗.

// 創(chuàng)建請(qǐng)求 -- 這里創(chuàng)建請(qǐng)求的參數(shù), 為一個(gè)必選值, 而url是一個(gè)可選值, 所以就會(huì)報(bào)錯(cuò), 這里談兩種簡(jiǎn)單的解決方式(在之前可選值那課有明確的解釋):
// 1. 強(qiáng)行解包 -- 格式就是在常量或者變量后面加一個(gè)嘆號(hào). 作用就是保證參數(shù)不為nil, 一定有值, 你就放心使用吧! 但是,一旦你保證錯(cuò)誤, 程序也會(huì)崩潰(例如: 將上面的網(wǎng)址字符串后面亂寫點(diǎn)字母, 就會(huì)實(shí)例化不成功, 就算這里強(qiáng)行解包了, 走到下一步也會(huì)造成崩潰).
let request = URLRequest(url: url!)
// 2. ?? 運(yùn)算符 -- 格式: 可選值 ?? 程序員自己設(shè)定的值. 作用就是一旦可選值為nil的時(shí)候, 就會(huì)將該可選值賦值為程序員設(shè)定的默認(rèn)值, 這樣就不會(huì)造成了程序崩潰.
let url2 = url ?? URL(string: "http://www.baidu.com")!
let request = URLRequest(url: url2)

2.if - let/var

  1. 使用if - let 判斷可選值是否為nil
  2. 定義一個(gè) 常量/變量 記錄可選值不為nil的結(jié)果 在if - let作用域中 直接使用定義好的常量即可.
2.1 判斷單個(gè)可選值
    func demo(){
        
        // if - let/var 判斷單個(gè)可選值
        let url = URL(string: "http://www.baidu.com")
        
        if let u = url {
            // 使用新的常量 u 來記錄 可選值url不為nil的情況, 當(dāng) u 存在, 也就證明url有值, 也就進(jìn)入到if - let作用域
            let request = URLRequest(url: u)
            print(request)
        }
        
        // 不僅判斷url 有值, 且包含"baidu"
        if let u = url, u.absoluteString.contains("baidu"){
            // 這里的逗號(hào)分隔判斷, 相當(dāng)于OC 的 &&, 必須同時(shí)滿足條件, 才能進(jìn)入到if - let作用域
            let request = URLRequest(url: u)
            print(request)
        }
    }
2.1 判斷多個(gè)可選值
    func demo(){
        
        // if - let/var 判斷多個(gè)可選值
        let name: String? = "老王"
        let age: Int? = 18
        
        if var n = name, let a = age{
            // 判斷多個(gè)可選值的時(shí)候也是使用逗號(hào)分隔開即可
            // 在作用域內(nèi)部需要修改名字的時(shí)候, 就需要將let -> var, 不對(duì)age進(jìn)行修改, 就還是用let
            n = "老李"
            print(n, a)
        }
    }

3. guard (守護(hù)) - let/var

  1. guard 定義一個(gè)常量有值, 如果沒有值 也就是為nil 直接return.
  2. 如果有值 不為nil 代碼繼續(xù)向下進(jìn)行.
  3. 判斷方式與if-let相反.
  4. Swift2.0提出的,少了一層代碼嵌套.
3.1 guard 判斷單個(gè)可選值
    func demo(){
        
        let url = URL(string: "http://www.baidu.com")
        
        // 單個(gè)可選值判斷
        // 定義一個(gè)常量 u 不為nil, 否則 進(jìn)入 guard 作用域
        guard let u = url else {
            // 為nil, 直接return
            return
        }
        
        // 不為nil, 之后所有用到url的操作, 都使用記錄的b常量 u 代替
        let request = URLRequest(url: u)
        print(request)
    }
3.2 guard 判斷多個(gè)可選值

更新: 判斷多個(gè)可選值的逗號(hào)相當(dāng)于oc中的 || (或者), 也就是只要有一個(gè)值為nil, 就會(huì)進(jìn)入guard (守護(hù)) - let/var作用域return掉.

    func demo(){
        
        let name: String? = "老王"
        let age: Int? = 18
        
        #更新`: 這里的逗號(hào)相當(dāng)于oc中的 || (或者), 也就是只要有一個(gè)值為nil, 就會(huì)進(jìn)入guard (守護(hù)) - let/var作用域return掉.
        guard let n = name, let a = age else {
            return
        }
        
        print(n, a)
    }

最后, 以上內(nèi)容如有問題, 歡迎指正, 或者有其他的問題, 也歡迎留言討論~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萧朝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件由蘑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诸衔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颇玷,“玉大人笨农,你說我怎么就攤上這事√” “怎么了谒亦?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)空郊。 經(jīng)常有香客問我份招,道長(zhǎng),這世上最難降的妖魔是什么狞甚? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任锁摔,我火速辦了婚禮,結(jié)果婚禮上哼审,老公的妹妹穿的比我還像新娘谐腰。我一直安慰自己孕豹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布怔蚌。 她就那樣靜靜地躺著巩步,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桦踊。 梳的紋絲不亂的頭發(fā)上椅野,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音籍胯,去河邊找鬼竟闪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杖狼,可吹牛的內(nèi)容都是我干的炼蛤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蝶涩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼理朋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绿聘,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤嗽上,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后熄攘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兽愤,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年挪圾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浅萧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哲思,死狀恐怖洼畅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棚赔,我是刑警寧澤土思,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站忆嗜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏崎岂。R本人自食惡果不足惜捆毫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冲甘。 院中可真熱鬧绩卤,春花似錦途样、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凛驮,卻和暖如春裆站,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黔夭。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工宏胯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人本姥。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓肩袍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親婚惫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氛赐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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