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