逻辑运算的操作对象是逻辑布尔值。Swift 支持基于 C 语言的三个标准逻辑运算。
逻辑非 !a
逻辑与 a&&b
逻辑或 a||b
一:逻辑非
逻辑非运算 !a 对一个布尔值取反,使得 true 变 false,false 变 true。
它是一个前置运算符,需出现在操作数之前,且不加空格。读作 非 a,然后我们看以下例子:
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// print "ACCESS DENIED"
if !allowedEntry 语句可以读作 "如果 非 alowed entry.",接下一行代码只有在如果 "非allow entry" 为 true,即 allowEntry 为 false 时被执行。
在示例代码中,小心地选择布尔常量或变量有助于代码的可读性,并且避免使用双重逻辑非运算,或混乱的逻辑语句。
二:逻辑与
逻辑与 a && b 表达了只有 a 和 b 的值都为 true 时,整个表达式的值才会是 true。
只要任意一个值为 false,整个表达式的值就为 false。事实上,如果第一个值为 false,那 么是不去计算第二个值的,因为它已经不可能影响整个表达式的结果了。这被称做 "短路计算"。
以下例子,只有两个值都为值的时候才允许进入:
// 逻辑与
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "ACCESS DENIED"
三:逻辑或
逻辑或 a || b 是一个由两个连续的 | 组成的中置运算符。它表示了两个逻辑表达式的其中 一个为 true,整个表达式就为 true。
同逻辑与运算类似,逻辑或也是"短路计算"的,当左端的表达式为 true 时,将不计算右边的表达式了,因为它不可能改变整个表达式的值了。
以下示例代码中,第一个布尔值 hasDoorKey 为 false,但第二个值 knowsOverridePassword 为 true,所以整个表达是 true,于是允许进入:
// 逻辑或
let hasDoorKey = false
let konwsOverridePassword = true
if hasDoorKey || konwsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "Welcome!"
四:组合逻辑
我们可以组合多个逻辑运算来表达一个复合逻辑:
if enteredDoorCode && passedRetinaScan || hasDoorKey || konwsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "Welcome!"
这个例子使用了含多个 && 和 || 的复合逻辑。但无论怎样,&& 和 || 始终只能操作两个值。所以这实际是三个简单逻辑连续操作的结果。我们来解读一下:
如果我们输入了正确的密码并通过了 视网膜扫描, 或者我们有一把有效的钥匙,又或者我们知道紧急情况下重置的密码,我们就能把门打开进入。
前两种情况,我们都不满足,所以前两个简单逻辑的结果是 false,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是 true。
五:使用括号来明确优先级
为了一个复杂表达式更容易读懂,在合适的地方使用括号来明确 优先 级是很 有效 的,虽然 它并非必要的。在上个关于门的权限的例子中,我们给第一个部分加个括号,使用它看起来逻辑更明确。
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || konwsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "Welcome!"
这括号使得前两个值被看成整个逻辑表达中独立 的一个部分。虽然有括号和没括号的输出结果是一样的,但对于读代码的人来说有括号的代码更清晰。
可读性比简洁性更重要,请在可以让你代码变清晰地地方加个括号吧!
网友评论