Swift邏輯運算
邏輯運算
邏輯運算的操作對象是邏輯布爾值。Swift 支持基於 C 語言的三個標準邏輯運算。
- 邏輯非(
!a
) - 邏輯與(
a && b
) - 邏輯或(
a || b
)
邏輯非
邏輯非運算(!a
)對一個布爾值取反,使得true
變false
,false
變true
。
它是一個前置運算符,需出現在操作數之前,且不加空格。讀作非 a
,然後我們看以下例子:
let allowedEntry = false
if !allowedEntry {
println("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"
if !allowedEntry
語句可以讀作 "如果 非 alowed entry。",接下一行代碼只有在如果 "非 allow entry" 爲true
,即allowEntry
爲false
時被執行。
在示例代碼中,小心地選擇布爾常量或變量有助於代碼的可讀性,並且避免使用雙重邏輯非運算,或混亂的邏輯語句。
邏輯與
邏輯與(a && b
)表達了只有a
和b
的值都爲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!"
這括號使得前兩個值被看成整個邏輯表達中獨立的一個部分。雖然有括號和沒括號的輸出結果是一樣的,但對於讀代碼的人來說有括號的代碼更清晰。可讀性比簡潔性更重要,請在可以讓你代碼變清晰地地方加個括號吧!