邏輯運算的操作對象是邏輯布爾值。Swift 支持基于 C 語言的三個標準邏輯運算。
!a)a && b)a || b)
邏輯非運算(!a)對一個布爾值取反,使得true變false,false變true。
它是一個前置運算符,需出現(xiàn)在操作數(shù)之前,且不加空格。讀作非 a,然后我們看以下例子:
let allowedEntry = false
if !allowedEntry {
println("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"
if !allowedEntry語句可以讀作 "如果 非 alowed entry。",接下一行代碼只有在如果 "非 allow entry" 為true,即allowEntry為false時被執(zhí)行。
在示例代碼中,小心地選擇布爾常量或變量有助于代碼的可讀性,并且避免使用雙重邏輯非運算,或混亂的邏輯語句。
邏輯與(a && b)表達了只有a和b的值都為true時,整個表達式的值才會是true。
只要任意一個值為false,整個表達式的值就為false。事實上,如果第一個值為false,那么是不去計算第二個值的,因為它已經(jīng)不可能影響整個表達式的結果了。這被稱做 "短路計算(short-circuit evaluation)"。
以下例子,只有兩個Bool值都為true值的時候才允許進入:
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"
邏輯或(a || b)是一個由兩個連續(xù)的|組成的中置運算符。它表示了兩個邏輯表達式的其中一個為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!"
這個例子使用了含多個&&和||的復合邏輯。但無論怎樣,&&和||始終只能操作兩個值。所以這實際是三個簡單邏輯連續(xù)操作的結果。我們來解讀一下:
如果我們輸入了正確的密碼并通過了視網(wǎng)膜掃描; 或者我們有一把有效的鑰匙; 又或者我們知道緊急情況下重置的密碼,我們就能把門打開進入。
前兩種情況,我們都不滿足,所以前兩個簡單邏輯的結果是false,但是我們是知道緊急情況下重置的密碼的,所以整個復雜表達式的值還是true。