位置:首頁 > 高級語言 > Swift教學 > Swift邏輯運算

Swift邏輯運算

邏輯運算

邏輯運算的操作對象是邏輯布爾值。Swift 支持基於 C 語言的三個標準邏輯運算。

  • 邏輯非(!a)
  • 邏輯與(a && b)
  • 邏輯或(a || b)

邏輯非

邏輯非運算(!a)對一個布爾值取反,使得truefalsefalsetrue

它是一個前置運算符,需出現在操作數之前,且不加空格。讀作非 a,然後我們看以下例子:

let allowedEntry = false
if !allowedEntry {
    println("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"

if !allowedEntry語句可以讀作 "如果 非 alowed entry。",接下一行代碼隻有在如果 "非 allow entry" 為true,即allowEntryfalse時被執行。

在示例代碼中,小心地選擇布爾常量或變量有助於代碼的可讀性,並且避免使用雙重邏輯非運算,或混亂的邏輯語句。

邏輯與

邏輯與(a && b)表達了隻有ab的值都為true時,整個表達式的值才會是true

隻要任意一個值為false,整個表達式的值就為false。事實上,如果第一個值為false,那麼是不去計算第二個值的,因為它已經不可能影響整個表達式的結果了。這被稱做 "短路計算(short-circuit evaluation)"。

以下例子,隻有兩個Bool值都為true值的時候才允許進入:

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"

邏輯或

邏輯或(a || b)是一個由兩個連續的|組成的中置運算符。它表示了兩個邏輯表達式的其中一個為true,整個表達式就為true

同邏輯與運算類似,邏輯或也是"短路計算"的,當左端的表達式為true時,將不計算右邊的表達式了,因為它不可能改變整個表達式的值了。

以下示例代碼中,第一個布爾值(hasDoorKey)為false,但第二個值(knowsOverridePassword)為true,所以整個表達是true,於是允許進入:

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "Welcome!"

組合邏輯

我們可以組合多個邏輯運算來表達一個複合邏輯:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "Welcome!"

這個例子使用了含多個&&||的複合邏輯。但無論怎樣,&&||始終隻能操作兩個值。所以這實際是三個簡單邏輯連續操作的結果。我們來解讀一下:

如果我們輸入了正確的密碼並通過了視網膜掃描; 或者我們有一把有效的鑰匙; 又或者我們知道緊急情況下重置的密碼,我們就能把門打開進入。

前兩種情況,我們都不滿足,所以前兩個簡單邏輯的結果是false,但是我們是知道緊急情況下重置的密碼的,所以整個複雜表達式的值還是true

使用括號來明確優先級

為了一個複雜表達式更容易讀懂,在合適的地方使用括號來明確優先級是很有效的,雖然它並非必要的。在上個關於門的權限的例子中,我們給第一個部分加個括號,使用它看起來邏輯更明確:

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "Welcome!"

這括號使得前兩個值被看成整個邏輯表達中獨立的一個部分。雖然有括號和冇括號的輸出結果是一樣的,但對於讀代碼的人來說有括號的代碼更清晰。可讀性比簡潔性更重要,請在可以讓你代碼變清晰地地方加個括號吧!