一、基本运算符
1、赋值运算符: =
2、算数运算符: + - * /
3、求余运算符:% 即: a = (b × 倍数) + 余数
4、浮点数求余计算: 例如 8%2.5 等于3余0.5,所以结果就是0.5
5、自增和自减运算
当++前置的时候,先自増再返回。
当++后置的时候,先返回再自增。
例如: var a = 0
let b = ++a // a 和 b 现在都是 1
let c = a++ // a 现在 2, 但 c 是 a 自增前的值 1
6、一元负号运算符
数值的正负号可以使用前缀-(即一元负号)来切换:
let three = 3
let minusThree = -three // minusThree 等于 -3
let plusThree = -minusThree // plusThree 等于 3, 或 "负负3"
7、一元正号运算符
一元正号(+)不做任何改变地返回操作数的值。
let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix 等于 -6
虽然一元+什么都不会改变,但当你在使用一元负号来表达负数时,你可以使用一元正号来表达正数,如此你的代码会具有对称美。
8、复合赋值:+=
例如:var a = 1
a += 2 // a 现在是 3
9、比较运算符
等于(a == b)
不等于(a != b)
大于(a > b)
小于(a < b)
大于等于(a >= b)
小于等于(a <= b)
10、三目运算符: 问题 ? 答案1 : 答案2
例如:
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight 现在是 90
11、空合运算符:??
表达式a必须是Optional类型
默认值b的类型必须要和a存储值的类型保持一致
例如:
a != nil ? a! : b
上述代码使用了三目运算符。当可选类型a的值不为空时,进行强制解封(a!)访问a中值,反之当a中值为空时,返回默认值b。无疑空合运算符(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性。
例如:
下文例子采用空合并运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:
let defaultColorName = "red"
var userDefinedColorName:String? //默认值为nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
//userDefinedColorName的值为空 ,所以colorNameToUse的值为`red`
另一种情况,分配一个非空值(non-nil)给 userDefinedColorName,再次执行空合运算,运算结果为封包在userDefaultColorName中的值,而非默认值。
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
//userDefinedColorName非空,因此colorNameToUsede的值为绿色
12、闭区间运算符
定义一个包含从a到b(包括a和b)的所有值的区间,b必须大于a
例如:
for index in 1...5 {
println("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25
13、半开区间运算符:a..<b
定义一个从a到b但不包括b的区间
半开区间的实用性在于当你使用一个0始的列表(如数组)时,非常方便地从0数到列表的长度。
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
println("第 \(i + 1) 个人叫 \(names[i])")
}
// 第 1 个人叫 Anna
// 第 2 个人叫 Alex
// 第 3 个人叫 Brian
// 第 4 个人叫 Jack
数组有4个元素,但0..<count只数到3(最后一个元素的下标),因为它是半开区间。
14、逻辑运算
逻辑非(!a):逻辑非运算(!a)对一个布尔值取反,使得true变false,false变true。
例如:
let allowedEntry = false
if !allowedEntry {
println("ACCESS DENIED")
}
// 输出 "ACCESS DENIED"
if !allowedEntry语句可以读作 "如果 非 alowed entry。",接下一行代码只有在如果 "非 allow entry" 为true,即allowEntry为false时被执行。
逻辑与(a && b):逻辑与(a && b)表达了只有a和b的值都为true时,整个表达式的值才会是true,只要任意一个值为false,整个表达式的值就为false。
例如:
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// 输出 "ACCESS DENIED"
逻辑或(a || b):逻辑或(a || b)是一个由两个连续的|组成的中置运算符。它表示了两个逻辑表达式的其中一个为true,整个表达式就为true。
例如:
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// 输出 "Welcome!"
15、逻辑运算符组合计算
例如:
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// 输出 "Welcome!"
我们来解读一下:
如果我们输入了正确的密码并通过了视网膜扫描; 或者我们有一把有效的钥匙; 又或者我们知道紧急情况下重置的密码,我们就能把门打开进入。前两种情况,我们都不满足,所以前两个简单逻辑的结果是false,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是true。