前言:
本篇僅為視頻學(xué)習(xí)筆記
可選項(xiàng)綁定
★ 可以使用可選項(xiàng)綁定來判斷可選項(xiàng)是否包含值
- 如果包含值就自動解包,把值賦給一個臨時的常量(let)或者變量(var),并返回true,否則返回false。
例-1
if let number = Int("123") { print("字符串轉(zhuǎn)換整數(shù)成功:\(number)") // number是強(qiáng)制解包之后的Intj值 // number作用域僅限于這個大括號 } else { print("字符串轉(zhuǎn)換整數(shù)失敗") } // 字符串轉(zhuǎn)換整數(shù)成功:123
如上,我們知道Int("123") 這個家伙轉(zhuǎn)出來,肯定是一個可選類型,也就是Int?這個類型。
那么,Int?這個類型,上篇內(nèi)容中我們發(fā)現(xiàn)它不等于nil時,我就替它強(qiáng)制解包,然后,把它解包之后的值,拿出來用。
但是,我們有另外一種方法,叫可選項(xiàng)綁定。注意如上代碼。直接 if let number = Int("123") 這么寫。那么它會怎么做呢?它會首先將“123”這個字符串嘗試轉(zhuǎn)換成Int,如果它轉(zhuǎn)換成功的話,我們知道,它返回的肯定是一個包含123這個值的一個可選項(xiàng)。如果這個可選項(xiàng)包含一個整數(shù)值的話,這個時候它會自動解包,注意,相當(dāng)于它把Int?解包成了Int類型,相當(dāng)于把123這個Int類型的數(shù)值,直接賦值給了numbr,并且這個條件返回true,返回true肯定會執(zhí)行,大括號里面的代碼。所以,到時候直接 print("字符串轉(zhuǎn)換整數(shù)成功:(number)")就可以了。number這個東西,已經(jīng)是解包后的值。number已經(jīng)是Int類型,而不是Int?類型。所以,(number) 這個地方不用加感嘆號。
例-2
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") } // no such season
枚舉Season內(nèi)部成員的原始值分別為1,2,3,4。Season(rawValue: 6) 這個方法是,傳一個原始值,會返回一個原始值所對應(yīng)的枚舉變量,給出來。
思考一下,在上述代碼中,你傳的原始值是6,那么枚舉Season內(nèi)部,僅有的4個成員,根本沒有原始值是6的枚舉變量,很明顯是沒有。所以,你這個原始值所對應(yīng)的枚舉值不存在,那么let season = Season(rawValue: 6)生成的這個枚舉肯定是失敗的。所以,像這種方法返回的應(yīng)該也是可選類型。因?yàn)槟銈鬟M(jìn)去的原始值,可能為有,也可能沒有。
那么,根據(jù)上面我們知道了這個season是自動解包之后的類型,它是Season類型,而不是Season?這個類型。
既然它是Season類型類型,我用就可以用switch這個.spring,還是其它。
如果是6,說名你是瞎傳的,所以,打印出來的結(jié)果為: // no such season。
等價寫法
if let first = Int("4") { if let second = Int("42") { if first < second && second < 100 { print("\(first) < \(second) < 100") } } } // 4 < 42 < 100
if let first = Int("4"), let second = Int("42"), first < second && second < 100 { print("\(first) < \(second) < 100") } // 4 < 42 < 100
上面兩段代碼,是等價的。我們先看第一段,代表4轉(zhuǎn)換成功才會執(zhí)行后邊的。42這個字符串轉(zhuǎn)換成功,才會執(zhí)行后面的。相當(dāng)于 if let first = Int("4") 這個條件和 if let second = Int("42") 同時成立才會來到 if first < second && second < 100。這句是你轉(zhuǎn)換的first,和second要符合if first < second && second < 100這個條件。才會打印 print("(first) < (second) < 100")。
說白了,你要想打印,那么外邊的三個條件必須成立。在if這里面,我們還可以按照第二種方法寫,就是第二段代碼。
if let first = Int("4")寫一個逗號, let second = Int("42")寫一個逗號,最后在這個 first < second && second < 100。其實(shí)說到這的話,其實(shí)就是上邊三個條件同時成立,那一說同時成立,大家可能會怎么想呢?用之前那個東西不行嗎?比如說如下:
用&&不是同時成立嗎?為什么又突然跑出一個逗號呢?大家很困惑,為什么要用&&呢?因?yàn)?amp;&左右兩邊,相當(dāng)于我們平常寫的true和false這樣的判斷,如果牽扯到這個可選項(xiàng)綁定的話,如 if let first = Int("4")。它是不能用&&這個符號的。所以,可選項(xiàng)綁定的話,它是使用逗號,逗號,逗號,也就是說不允許你像上圖一樣。
★ while循環(huán)中使用可選項(xiàng)綁定
// 要求:遍歷數(shù)組,將遇到的正數(shù)都加起來,如果遇到負(fù)數(shù)或者非數(shù)字,停止遍歷 var strs = ["10", "20", "abc" ,"-20" ,"30"] var index = 0 var sum = 0 while let num = Int(strs[index]), num > 0 { sum += num index += 1 } print(sum) // 30
如上邊代碼,index是輔助while循環(huán)的,sum整數(shù)和。現(xiàn)在我們看一眼,是怎么做的。首先要想遍歷我們這個數(shù)組的話,肯定會這么strs[index]做,搞一個數(shù)組,弄個下標(biāo),這個下標(biāo)是從0開始的,所以,一開始先取出0這個位置的字符串,相當(dāng)于10這個字符串放到了Int( )這里。10這個字符串可能會轉(zhuǎn)換失敗,所以我們要使用可選項(xiàng)綁定 let num = Int(strs[index]),那么,如果是轉(zhuǎn)換成功的,并且sum是大于0的。
思考一下,那么不就是代表let num = Int(strs[index]), num > 0這兩個條件要同時成立嗎?那說白了就是,從數(shù)組里面取出字符串,假設(shè)是正數(shù)的話就會執(zhí)行大括號里面的代碼。并且把它累加起來,累加一個,那么index加+=1。
再進(jìn)入下一輪外while循環(huán),然后這個時候index就變成了1,這個時候就取出這個20,又是轉(zhuǎn)換成功,并且num大于0,所以又會加起來,然后index += 1,那么index這個索引,變成2。
2的話取出abc。abc和明顯是轉(zhuǎn)換失敗,說白了就是 let num = Int(strs[index])這個可選值綁定失敗,一旦失敗,就意味著整個while循環(huán)不成立,就退出while循環(huán),就來到后邊打印這個sum。即 print(sum)。
所以最后,打印出來是30。