06-可選項(xiàng)

//可選項(xiàng)1-14
//1.可選項(xiàng),也叫可選類(lèi)型,它允許將值設(shè)置為nil胶坠,在類(lèi)型名稱后面加個(gè)問(wèn)號(hào)搓茬?來(lái)定義一個(gè)可選項(xiàng)
var name : String? = "Jack"
name = nil
var age : Int? //默認(rèn)就是nil
age = 10
age = nil

var array = [1, 15, 40, 29]
func get(_ index: Int) -> Int? {
    if index < 0 || index >= array.count {
        return nil
    }
    return array[index]
}
print(get(1))//Optional(15)
print(get(-1))//nil
//2.強(qiáng)制解包,可選項(xiàng)是堆其他類(lèi)型的一層包裝寇蚊,可以將它理解為一個(gè)盒子,如果為nil,那么它是個(gè)空盒子,如果不是nil,那么盒子里裝的是:被包裝類(lèi)型的數(shù)據(jù),如果要從可選項(xiàng)中取出被包裝的數(shù)據(jù)(將盒子里裝的東西取出來(lái)),需要使用感嘆號(hào)!進(jìn)行強(qiáng)制解包
var age0: Int? = 10
var ageInt : Int = age0!
ageInt += 10
//如果對(duì)值為nil的可選類(lèi)型空盒子進(jìn)行強(qiáng)制解包第晰,將會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤
var age1 : Int?
//age1!

//3.判斷可選項(xiàng)是否包含值
let number = Int("123")
if number != nil {
    print("字符串轉(zhuǎn)換整數(shù)成功:\(number!)")//字符串轉(zhuǎn)換整數(shù)成功:123
} else {
    print("字符串轉(zhuǎn)換整數(shù)失敗")
}

//4.可選項(xiàng)綁定谓苟,用來(lái)判斷可選項(xiàng)是否包含值,如果包含就自動(dòng)解包涕癣,把值賦值給一個(gè)臨時(shí)的常量let或者變量var,并返回true哗蜈,否則返回false
if let number0 = Int("123") {
    print("字符串轉(zhuǎn)換整數(shù)成功:\(number0)")//字符串轉(zhuǎn)換整數(shù)成功:123
    //number0是強(qiáng)制解包之后的Int值前标,作用域僅限于這個(gè)大括號(hào)
} else {
    print("字符串轉(zhuǎn)換整數(shù)失敗")
}

enum Season : Int {
    case spring = 1, summer, autumn, winter
}
if let season =  Season(rawValue: 6) {
    switch season {
    case .spring:
        print("the season is spring")
    default:
        print("the season is other")
    }
} else {
    print("no such season")//
}

//5.等價(jià)寫(xiě)法 值綁定和時(shí)用,
if let first = Int("4") {
    if let second = Int("42") {
        if first < second && second < 100 {
            print("\(first) < \(second) < 100")
        }
    }
}

if let first0 = Int("4"),
    let second0 = Int("42"),
    first0 < second0 && second0 < 100 {
    print("\(first0) < \(second0) < 100")
}

//6.while循環(huán)中使用可選綁定
//遍歷數(shù)組,將遇到的整數(shù)都加起來(lái),如果遇到負(fù)數(shù)或非數(shù)字停止遍歷
var strs = ["10", "20", "abc", "-20", "30"]
var index0 = 0
var sum = 0
while let num = Int(strs[index0]), num > 0 {
    sum += num
    index0 += 1
}
print(sum)

/*7.空合運(yùn)算符??
 a??b
 a是可選項(xiàng)距潘,b是可選項(xiàng)或者不是可選項(xiàng)
 b跟a的存儲(chǔ)類(lèi)型必須相同
 如果a不為nil炼列,就返回a,如果a為nil,就返回b
 如果b不是可選項(xiàng)音比,返回a時(shí)會(huì)自動(dòng)解包
 ??的運(yùn)算類(lèi)型由b決定
*/
let a0: Int? = 1
let b0: Int? = 2
let c0 = a0 ?? b0 //c0是Int?,Optional(1)

let a1: Int? = nil
let b1: Int? = 2
let c1 = a1 ?? b1 //c1是Int?,Optional(2)

let a2: Int? = nil
let b2: Int? = nil
let c2 = a2 ?? b2 //c2是Int?,nil

let a3: Int? = 1
let b3: Int = 2
let c3 = a3 ?? b3 //c3是Int,1

let a4: Int? = nil
let b4: Int = 2
let c4 = a4 ?? b4 //c4是Int,2

let a5: Int? = nil
let b5: Int = 2
//如果不使用??運(yùn)算符
let c5: Int
if let tmp = a5 {
    c5 = tmp
} else {
    c5 = b5
}

//8.多個(gè)俭尖??一起使用
let a6: Int? = 1
let b6: Int? = 2
let c6 = a6 ?? b6 ?? 3 //c6是Int洞翩,1

let a7: Int? = nil
let b7: Int? = 2
let c7 = a7 ?? b7 ?? 3 //c7是Int,2

let a8: Int? = nil
let b8: Int? = nil
let c8 = a8 ?? b8 ?? 3 //c8是Int,3

//9.??跟if let 配合使用
let a9: Int? = nil
let b9: Int? = 2
if let c9 = a9 ?? b9 {//類(lèi)似于if a != nil || b != nil
    print(c9)
}
if let c10 = a9, let d10 = b9 {//類(lèi)似于 if a != nil &&  b != nil
    print(c10)
    print(d10)
}

//10. if語(yǔ)句實(shí)現(xiàn)登錄
func login(_ info: [String : String]) {
    let userName: String
    if let tmp = info["userName"] {
        userName = tmp
    } else {
        print("請(qǐng)輸入用戶名")
        return
    }
    let password: String
    if let tmp = info["password"] {
        password = tmp
    } else {
        print("請(qǐng)輸入密碼")
        return
    }
    print("用戶名:\(userName)","密碼:\(password)","登錄ing")
}
login(["userName" : "Jack", "password" : "123456"])
login(["password" : "123456"])
login(["userName" : "Jack"])

/*
 11.guard語(yǔ)句 解決上邊作用域麻煩的問(wèn)題
 guard 條件 else {
    //do something
    退出當(dāng)前作用域
    //return稽犁、break、continue骚亿、throw error
 }
 1當(dāng)guard語(yǔ)句的條件為false時(shí),就會(huì)執(zhí)行大括號(hào)里面的代碼,當(dāng)guard語(yǔ)句的條件為true時(shí)已亥,就會(huì)跳過(guò)guard語(yǔ)句
 2guard語(yǔ)句特別適合用“提前退出”
 3當(dāng)使用guard語(yǔ)句進(jìn)行可選綁定的時(shí),綁定的變量var、常量let也能在外層作用域中使用
 */
func login0(_ info: [String : String]) {
    guard let userName0 = info["userName"] else {
        print("請(qǐng)輸入用戶名")
        return
    }
    guard let password0 = info["password"] else {
        print("請(qǐng)輸入密碼")
        return
    }
    print("用戶名:\(userName0)","密碼:\(password0)","登錄ing")
}

/*
 12.隱式解包来屠,在類(lèi)型后面加個(gè)感嘆號(hào)虑椎!定義一個(gè)隱式解包可選項(xiàng)。盡量少用!,用俱笛?即可安全些捆姜,知道就行
 在某些情況下,可選項(xiàng)一旦被設(shè)定值之后就會(huì)一直擁有值,在這種情況下可以去掉檢查迎膜,也不必每次訪問(wèn)的時(shí)候都解包娇未,因?yàn)樗艽_定每次訪問(wèn)的時(shí)候都有值。
 */
let num1: Int! = 10
let num2: Int = num1
if num1 != nil {
    print(num1 + 6)//16
}
if let num3 = num1 {
    print(num3)
}
let num4: Int? = nil
//let num5: Int = num4

//13.字符串插值
//可選項(xiàng)在字符串插值或者直接打印時(shí)星虹,編譯器會(huì)發(fā)出警告
var age2: Int? = 10
print("My age is \(age2)") //My age is Optional(10)

//如有警告3中方法解決
print("My age is \(age2!)") // 10
print("My age is \(String(describing: age2))")//Optional(10)
print("My age is \(age2 ?? 0)") //10

//14.多重可選項(xiàng) 容易設(shè)置面試題
var num6: Int? = 10
var num7: Int?? = num6
var num8: Int?? = 10
print(num7 == num8) //true

var num9: Int? = nil
var num10: Int?? = num9
var num11: Int?? = nil
print(num10 == num11) //false //易錯(cuò)點(diǎn) 
(num10 ?? 1) ?? 2 //2  //易錯(cuò)點(diǎn) //num9??2 //2
(num11 ?? 1) ?? 2 //1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末零抬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宽涌,更是在濱河造成了極大的恐慌平夜,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卸亮,死亡現(xiàn)場(chǎng)離奇詭異忽妒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)兼贸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)段直,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人溶诞,你說(shuō)我怎么就攤上這事鸯檬。” “怎么了螺垢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵喧务,是天一觀的道長(zhǎng)赖歌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)功茴,這世上最難降的妖魔是什么庐冯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坎穿,結(jié)果婚禮上展父,老公的妹妹穿的比我還像新娘。我一直安慰自己玲昧,他們只是感情好栖茉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著酌呆,像睡著了一般衡载。 火紅的嫁衣襯著肌膚如雪搔耕。 梳的紋絲不亂的頭發(fā)上隙袁,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音弃榨,去河邊找鬼菩收。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲸睛,可吹牛的內(nèi)容都是我干的娜饵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼官辈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼箱舞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拳亿,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晴股,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后肺魁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體电湘,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鹅经,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寂呛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘾晃,死狀恐怖贷痪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹦误,我是刑警寧澤呢诬,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布涌哲,位于F島的核電站,受9級(jí)特大地震影響尚镰,放射性物質(zhì)發(fā)生泄漏阀圾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一狗唉、第九天 我趴在偏房一處隱蔽的房頂上張望初烘。 院中可真熱鬧,春花似錦分俯、人聲如沸肾筐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吗铐。三九已至,卻和暖如春杏节,著一層夾襖步出監(jiān)牢的瞬間唬渗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工奋渔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镊逝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓嫉鲸,卻偏偏與公主長(zhǎng)得像撑蒜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玄渗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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