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