iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0
Mobile Development

Swift30天:從語法到觀念,告訴你在踏入實作前最好弄清楚的那些事系列 第 3

# Day3--向左走?向右走?再走一次?那些替你做決定的小事

條件運算

條件運算會分成三個部分,在我目前學到的Swift語言中,我認為有三種條件運算必須要整合成一個單元來複習:

  1. if…else(最基本的條件運算)
  2. guard…else(則否條件運算)
  3. switch case(切換條件判斷)

簡言上述三種條件運算的邏輯:
if…else比較屬於是直線式邏輯,一個東西進來之後,一直經過層層過濾,最後才認為它被歸屬為哪個條件之下的產物。

guard…else 則如其名,像個守衛,如果你符合它守護的原則,那麼你所提的條件就會被它接納,否,則被踢除,端看else後的條件是什麼,產出產物。

Switch case有趣些,它比較像是平行所有的條件,然後你符合Switch語法裡的哪一個case,就走那向case給出的條件過濾,然後產出那個條件下的產物。

if...else

最常見的就是if...else的運算,或者也可以直白的以中文來說,就是:「如果...就...」

if…else語法應該是最基礎的條件運算語法了,幾乎每個程式語言都有,我之前寫過的Python也有這種運算的語法,只不過如果要詳細一點說,Swift的if條件運算語法有三個小分類:

  1. 單純的if
if A{
  return B
}

如果A條件成立,就執行B

  1. if...else
if A{
   //implement B
}else{
   //implement C
}

如果A條件成立,就執行B,若否,就執行C
這種運算的想法跟guard…else很像,只要條件一沒有成立,就是走向另一個結果。

  1. if...else if...
if A1{
  //implement B
}else if A2{
  //implement C
}else if A#{
  //implement D
}

這種邏輯則偏向多條件式的運算,且通常具有順序性,假若條件A1失敗,那就走向條件A2,依此類推,符合其條件的就執行其中的內容。
不過由於它是層層的過濾條件,因此在速度上會比Switch case慢些。

guard...else

條件運算這件事情,除了基本型的if…else,還有一種,叫做guard…else,誠如上一篇簡短的描述:

guard…else 如其名,像個守衛,如果你符合它守護的原則,那麼你所提的條件就會被它接納,否,則被踢除,端看else後的條件是什麼,產出產物。

guard的邏輯是某條件為真,不然就是某條件為假,產出兩種結果。

if…else則是可以包含多重條件的前提,然後進行篩選,和guard比較的話,會有一種感覺是:guard比較單純,就是符合條件或不符合條件兩者。

總之,guard在操作上有點像個守衛,你是好人,就讓你進來,你是壞人,就掰掰。

func passwordCheck(code:String){
    guard code == "password" else{
       print("shit,not right,Bro!")
       return
    }
    print("Ok,got you now")
}

let rightcode = "password"
passwordCheck(code:rightcode)

所以,要記得一件事情,guard...else有一個特點是:會先描述條件不符合後執行的內容,然後在執行完後,若符合條件才會執行符合條件的內容。

或者回到剛剛的說法:守衛總是會記得誰看起來像是壞人,誰是壞人就讓壞人不能進來,好人則可以進來。

使用guard…else的優勢
這裡我想套用之前在網路上看到彼得潘對guard…else的描述:
可讀性佳

不用浪費時間讀取不需要的程式碼

大概在這裡可以重新描述他在第一點裡提到的:if…else通常會把所有條件論述一遍,最後才產出結果,而guard…else只有執行一回合的程式語言,如果執行如果為否,則立馬產出結果。

而可讀性這件事情,大抵可以說大家都知道guard是只要暸解一個條件,就會產出兩個結果,且一翻兩瞪眼的邏輯,所以不用if…else這要查看很多邏輯條件啊!

補充:三元運算子(termary operator)

如果你對上一篇的if…else算是熟悉,你可以大概的知道if…else的程式邏輯是一個區塊又一個區塊的,而在這裡,三元運算子提供了一個更簡便的寫法:

原先的if…else大概會讓程式語言的呈現變成下面這樣:

let isTainan = true
if isTainan{
    print("food alway sweet")
}else{
    print("not really add suger in food")
}

但這種情況由於邏輯簡單,所以可以以三元運算子的方式下去處理,公式大概如下:

「條件」?「符合條件的結果」:「不符合條件的結果」
或者套用Syashin Chen的說法更為簡單:

公式: a ? b : c,條件 a 為 True ,回傳 b。條件 a 為 false ,回傳 c。

let isTainan = true
print(isTainan ? "food alway sweet":"not really add suger in food")

Switch case

Switch case到底在幹什麼呢?要我形容,它就是一個多條件同時判斷的判斷式,網路上有相關評測大概是有提到if…else跟Switch case到底哪個比較耗時,結論是if…else比較耗時。(前提是跑類似內容的東西,我不知道我這樣講好不好)
1.Switch Case
如下面所說的,Switch case一次就會描述所有的條件,然後,還會追加一個條件叫做默認條件(default),基本上Switch case在運作的時候,只要匹配到第一個符合條件的項目,就會結束整個程式,這也就是它跟if…else相比快的地方。

Switch case在寫的時候,必須注意幾件事情:

  1. 條件有沒有窮盡?case必須窮盡所有情形。
  2. 一定要有default的情況,否則程式會有問題。
    switch case也有一種方式可以宣告暫時性的常數或變數,並進行條件限制上的制定:

tags: 鐵人賽

上一篇
#Day2-- 賣藥仔是我!你想要用哪種盒子裝?
下一篇
# Day4--欸不是,還要再來一遍喔?迴圈別鬧了
系列文
Swift30天:從語法到觀念,告訴你在踏入實作前最好弄清楚的那些事30

尚未有邦友留言

立即登入留言