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