Swift中的邏輯分支

簡(jiǎn)介

  • 邏輯分支即常用的 ifswitch、三目這些通過邏輯判斷后決定后面執(zhí)行什么的邏輯語(yǔ)句,通過分支語(yǔ)句可以控制程序的執(zhí)行方向和流程。
  • Swift 中邏輯分支的特點(diǎn)
    1. Swift 中沒有 C 語(yǔ)言中 非零即真 的概念;
    2. 所有判斷條件必須顯式的指明具體的判斷條件 true 或者 false。

if邏輯分支

  • 簡(jiǎn)單體驗(yàn)

    func demo() {
       let a = 10
       if  a >= 10 {
          print("OK")
       }
    }
    

    以上代碼是一段正確的可執(zhí)行代碼,在執(zhí)行過程中程序會(huì)判斷 a 是否大于或者等于 10,如果滿足判斷條件就執(zhí)行{}里面的語(yǔ)句,否則將不執(zhí)行。

  • Swift中 if 語(yǔ)句的特點(diǎn)

    1. 判斷語(yǔ)句不需要();
    2. 執(zhí)行語(yǔ)句必須要用{},即使后面只有一句代碼也不允許省略。
  • 可選項(xiàng)的邏輯判斷

    • 在可選項(xiàng)的解包過程中如果我們使用 ! 來(lái)強(qiáng)行解包,會(huì)出現(xiàn)可選值為空的風(fēng)險(xiǎn),例如以下代碼會(huì)出現(xiàn)的問題:

      override func viewDidLoad() {
        super.viewDidLoad()
        
        demo(x: 10, y: nil)
      }
      
      func demo(x : Int?, y : Int?) {
        print(x! + y!)
      }
      

      當(dāng)函數(shù) demo 中傳入一個(gè) nil 值的時(shí)候會(huì)出現(xiàn)運(yùn)行錯(cuò)誤,這個(gè)錯(cuò)誤我們會(huì)經(jīng)常碰到,所以在選擇解包方法的時(shí)候就需要作出有效的判斷,避免出現(xiàn)這種錯(cuò)誤,以下代碼為修正版:

      override func viewDidLoad() {
        super.viewDidLoad()
        
        demo(x: 10, y: nil)
      }
      
      func demo(x : Int?, y : Int?) {
        if  x != nil && y != nil {
          print(x! + y!)
        } else {
          print("x 或者 y 的值為 nil")
        }
      }
      

      以上代碼解決了可選值為空的風(fēng)險(xiǎn),但是會(huì)造成新的問題。如果可選值的賦值足夠復(fù)雜的情況下那么我們寫出的代碼就會(huì)很丑陋,例如王巍在自己書中的一段反面教材:

      復(fù)雜型可選項(xiàng)解包展示

      從上面圖片中可以看出在解包一個(gè)復(fù)雜性 json 字符串的時(shí)候出現(xiàn)了大量的 if 語(yǔ)句和大量的花括號(hào),使代碼顯得冗余繁雜,看了開頭就不想看結(jié)尾的感覺,這樣的代碼被人稱為“不是給人讀的代碼”。在Swift中提供了一個(gè)簡(jiǎn)單的三目運(yùn)算符可以大大提高開發(fā)效率也可以大大提高代碼的可讀性,下面上代碼演示:

      override func viewDidLoad() {
          super.viewDidLoad()
          demo()
      }
      func demo(a : Int?, b : Int) {
         print((a ?? 0) + (b ?? 0))
      }
      

      上面代碼中使用一個(gè) ?? 運(yùn)算符解決了代碼冗余的問題,而且可讀性也大大提高。這個(gè) ?? 是一個(gè)簡(jiǎn)單的三目,它的作用是判斷 ?? 運(yùn)算符前面的可選值(如果有值使用值,如果沒有值使用運(yùn)算符后面的值作為替代運(yùn)算)。
      值得注意的是,?? 運(yùn)算符的優(yōu)先級(jí)比較低,所以在使用的時(shí)候要注意優(yōu)先級(jí)。

if let / var 連用語(yǔ)法

if letif var連用不是單純的 if 語(yǔ)句,是賦值的同時(shí)判斷對(duì)象是否為 nil,判斷完之后{}內(nèi)一定有值,可以直接使用不需要解包。如果判斷對(duì)象為nil ,不執(zhí)行 {}里的代碼直接向下執(zhí)行。以下代碼演示:

  • if let
    override func viewDidLoad() {
       super.viewDidLoad()
       demo()
    }
    func demo() {
       let memberName : String? = “張三”
       let memberAge : Int? = 18
       if let oName = memberName,
               oAge = memberAge {
               print(oName + "今年" + String(oAge) + "歲了")
        }
    }
    

    輸出到打印臺(tái)的結(jié)果:


    if let 輸出結(jié)果
  • if var
    override func viewDidLoad() {
       super.viewDidLoad()
       demo()
    }
    func demo() {
       let memberName : String? = "張三"
       let memberAge : Ing? = 18
       if var oName = memberName,
          let oAge = memberAge {
            oName = "李四"
            print(oName + "今年" + String(oAge) + "歲了")
       }
    }
    
    輸出到打印臺(tái)的結(jié)果:
    let var 輸出結(jié)果

    通過輸出結(jié)果可以看到,let var 的接收值在 {} 中是允許修改的,這樣我們?cè)陂_發(fā)中就可以靈活使用。

guard let 守護(hù)語(yǔ)句

Swift2.0的時(shí)候推出了guard let守護(hù)語(yǔ)句,guard letif let 的功能正好相反。如果被guard let 守護(hù)的對(duì)象值為 nil 就執(zhí)行 {} 里的代碼,如果對(duì)象值不為 nil 就繼續(xù)向下執(zhí)行。以下代碼演示:

   override func viewDidLoad() {
       super.viewDidLoad()
       demo()
   }
   func demo() {
      let memberName = "張三"
      let memberAge = 18
      guard let oName = memberName,
            let oAge = memberAge else {
             print("姓名或者年齡為nil")
             return
      }
      // 代碼執(zhí)行到這,oName 和 oAge 一定有值
     print(oName + "今年" + String(oAge) + "歲了")
   }

打印臺(tái)輸出結(jié)果:

guard let 輸出結(jié)果

剛剛接觸 guard let 的朋友也許會(huì)覺得奇怪,蘋果為什么會(huì)設(shè)計(jì)這樣一種奇葩的語(yǔ)法格式。之前我接觸過的所有開發(fā)語(yǔ)言中都沒有這樣的先例,剛學(xué)習(xí)Swift的時(shí)候我也覺得奇怪,但用熟練了之后發(fā)現(xiàn)這樣的設(shè)計(jì)方式真的很人性化,并且能很有效的縮短閱讀代碼的時(shí)間。
通常在做完判斷是否有值之后,會(huì)做具體的邏輯判斷,具體的邏輯通常代碼量會(huì)很大,如果用 if let 就會(huì)憑空多出一層分支,guard let 可以有效的減少分支量。

三目

  • 簡(jiǎn)單體驗(yàn)
     let a = 10
     a > 5 ? print("變量a大于5") : print("變量a不大于5")
    
  • Swift中三目的特點(diǎn)
    1. Swift中的三目運(yùn)算保持了和Objective-C一致的風(fēng)格;
    2. Swift中的三目運(yùn)算符支持空?qǐng)?zhí)行的操作,例如上面代碼中的print("變量a不大于5")永遠(yuǎn)不會(huì)被執(zhí)行到,這樣不會(huì)被執(zhí)行到的代碼可以省略為()。

Switch邏輯分支

  • Objective-C中的switch
    1. Objective-C 中,switch 的分支值類型必須是整數(shù);
    2. 每個(gè)語(yǔ)句都需要一句 break;
    3. 如果要穿透可以省略 break;
    4. 如果要定義局部變量,必須加 {}確定該變量的作用域。
  • Swift 中的 switch
    1. Swift 中的 switch 可以對(duì)任意的數(shù)據(jù)類型進(jìn)行分支,不再局限于整數(shù);
    2. 一般情況下不需要 break;
    3. 如果要多值穿透,使用 , 分隔;
    4. 每一個(gè) case 后面必須有可以執(zhí)行的語(yǔ)句,如果不需要做任何操作才需要使用 break;
    5. 要保證處理所有可能的情況,不然編譯器直接報(bào)錯(cuò),不處理的條件可以放在 default 分支中;
    6. 每個(gè)分支中定義的臨時(shí)變量只在當(dāng)前 case 中有效,不需要再添加 {}
  • 代碼示例
    override func viewDidLoad() {
       super.viewDidLoad()
       doSwitch(score : "及格")
    }
    func doSwitch (score : String) {
       switch score {
       case: “及格”:
          let name = "員工"
          print(name + "成績(jī)60~79")
       case: "良":
          print("成績(jī)80~89")
       case: "優(yōu)":
          print("成績(jī)90~100")
       default:
          break
       }
    }
    

    控制臺(tái)輸出結(jié)果:


    switch演示控制臺(tái)輸出結(jié)果

    修改值后輸出結(jié)果展示

總結(jié)

  • Swift中不存在 C 語(yǔ)言中的 非零即真 概念,在邏輯判斷的時(shí)候必須顯式的指明具體的 truefalse;
  • ?? 運(yùn)算符可以用于判斷可選值是否為 nil,如果是nil 就是用后面的值替代;
  • if letif var 的區(qū)別在于{}里的值是否可以改變;
  • guard letif let 語(yǔ)法相反,guard letSwift2.0的時(shí)候推出的;
  • guard let 能夠一次性判斷每一個(gè)值,在真正的代碼邏輯部分少了一層嵌套,使代碼更加優(yōu)雅;
  • Swift 中的 switch 不局限于整數(shù),可以對(duì)任意的數(shù)據(jù)類型進(jìn)行分支,寫法基本與 Objective-C 一致。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容