★ iOS高級:Swift入門精講③ 01 swift編程-08可選項(xiàng)綁定(Optional Binding)

前言:

本篇僅為視頻學(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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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