发布于 2015-06-14 01:57:08 | 165 次阅读 | 评论: 0 | 来源: 网络整理
逻辑运算的操作对象是逻辑布尔值。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!"
这括号使得前两个值被看成整个逻辑表达中独立的一个部分。虽然有括号和没括号的输出结果是一样的,但对于读代码的人来说有括号的代码更清晰。可读性比简洁性更重要,请在可以让你代码变清晰地地方加个括号吧!