Range Operators (范围操作符)
在Swift中包含两种范围操作符,它们都是一个数值范围表达式的一种缩写方式.
Closed Range Operator (闭区间范围操作符)
闭区间范围操作符(a...b)定义声明了一个从a到b之间的范围,并且包括a和b.
闭区间操作符通常用在迭代查询一个范围内所有的值,例如for-in循环:
for index in 1...5 {
println("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
Half-Closed Range Operator (半闭范围操作符)
半闭范围操作符(a..b)定义声明了一个范围从a到b,但是不包括b的值.也就是说,半闭范围操作符包含范围的第一个值a,但是不包含最后的值b.
半闭范围操作符在处理以零开始的列表(例如数值)时候特别有用,它可以用来一直计算到列表的长度(但不超过长度值):
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..count {
println("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
注意代码中,数值包含四个元素,但是 0..count只会最大到3(数值元素的最大索引),都是因为半闭范围操作.
Logical Operators (逻辑操作符)
逻辑操作符修改或者组合布尔类型的值true和false.
Swift支持C语言中的三种基本的逻辑操作符:
-
- Logical NOT (!a) // 逻辑非
- Logical AND (a && b) // 逻辑与
- Logical OR (a || b) // 逻辑或
Logical NOT Operator (逻辑非)
逻辑非操作符(!a)反转布尔类型的值 ,将true变成false,或将false变成true.
逻辑操作符是一个前缀操作符,写在操作值的前面,没有任何空格.可以理解它为”不是...”,参考下面的代码例子:
let allowedEntry = false
if !allowedEntry {
println("ACCESS DENIED")
}
// prints "ACCESS DENIED”
语句 if !allowedEntry 可以被理解为” if not allowed entry.( 如果不允许进入)”.如果条件成立,后面的语句才会执行,也就是说,allowedEntry 的值是false.
在这个代码例子里,请注意选择使用布尔类型常量和变量的名称,这样有助于代码的可读性和准确,避免使用双重否定或者令人迷惑的逻辑句子.
Logical AND Operator (逻辑与)
逻辑与操作符(a && b)创建一个逻辑表达式,只有当每个表达式的值都为true的时候,整个表达式的值才会是true.
如果逻辑与中任何一个值为false,那么整个表达式的值就是false.实际上,如果逻辑与的第一个值是false,那么第二个表达式将不会被计算执行,因为它不可能使整个表达式的值为true. 这就是短路诊断(short-circuit evaluation:笔者根据自己理解翻译此专业名词术语,可能会与其他资料有所差异)
下面的例子中,判断两个布尔类型的值,只有两个值都为true的时候,才允许访问:
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "ACCESS DENIED”
Logical OR Operator (逻辑或)
逻辑或操作符(a || b)是一个中缀操作,使用||表示.使用它建立的逻辑表达式:只要两个值里有一个值为true,那么整个表达式的值也是true.
与逻辑与相似,逻辑或使用短路诊断来确认表达式的值.如果逻辑或左边的表达式值为true,那么右边的表达式不会参与运算,因为它不可能改变整个表达式的结果.
在下面的代码例子中,第一个布尔值 (hasDoorKey)为false,但是第二个值(knowsOverridePassword) 为true,由于只要一个值为true,整个表达式的值就为true,所以访问是可以的:
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!”
Combining Logical Operators (复合逻辑操作符)
你可以使用复合逻辑操作符来创建一个长的复杂的逻辑表达式:
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!”
在这个例子中,使用了多个 && 和 || 操作符来建立一个长的复杂表达式.然而&& 和 || 操作符仍然只处理两个值,因此实际上它可以理解为是将三个小的表达式组合在一起:
如果进入正确的门号(enteredDoorCode),并且通过了视网膜扫描(passedRetinaScan),或者如果有门钥匙 (hasDoorKey),再或者知道紧急通道的密码(knowsOverridePassword),那 么可以通行.
根据enteredDoorCode, passedRetinaScan和 hasDoorKey的值,可以知道前面两个表达式的结果是false,但紧急通道密码是知道的(knowsOverridePassword = true),因此整个表达 式的值是true.
Explicit Parentheses (清晰的括号限定)
有时候,使用括号()来包住表达式这样可以使复杂的表达式更具有可读性(尽管这个限定在Swift中没有强制要求).在上面的代码中,可以添加括号()使复合的表达式更加明晰:
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!”
括号使得前面两个值更加明确,在整个表达式中尽可能的分隔开,却并不影响整个表达式的值,又使得整个表达式更容易阅读.在代码中,可读性总是要高于简洁性.
Welcome to Swift (苹果官方Swift文档初译与注解十七)---108~115页(第二章)