参考:
https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-ID60
运算符是一种特殊的符号或短语,用于检查、修改或者组合值。举例说明,加法运算符(+)可以得到两个值之和,就像let i = 1+2 ,i等于3;逻辑与运算符(&&)判断2个布尔值是否都为真,比如entereddoorcode & passedretinascan,当entereddorrcode和passedretinascan都为true时,表达式等于true。
Swift支持大多数标准C语言的运算符(但不支持++和--),并改进了其中一部份运算符以减少编码错误。当应该使用判断相等(==)操作符却错误的使用了赋值操作符(=)时,不会真正的进行赋值操作(说明:这跟Java/C语言都不同。稍候会详细解释)。Xcode会对算术运算符(+,-,*,/,%等)的范围进行检测,不允许值溢出,否则Xcode会提示错误;从而避免值越界时导致的未知问题。当有可能出现值溢出的情况时, 你可以使用溢出运算符(在后续章节再详细介绍)。
Swift还提供了C语言没有的范围运算符(a..<b和a...b),用在设置区间范围的情况下。
本文介绍了Swift常用的运算符,在后续的“高级运算符”章节会详细介绍自定义运算符(或者叫运算符重载)。
术语:
运算符可分为一元、二元或者三元运算符(跟Java/C一样)。
一元运算符用在单个参数(例如 -a)。一元运算符可当作参数的前缀(例如!b)或者当作参数的后缀(例如c!),由一个参数和一个运算符组成。备注:在Java/C没有类似c!的语法, 在Swift中用在Optional类型取值。
二元运算符用在两个参数之间(例如2+3),由2个参数和一个运算符组成。
三元运算符用在3个参数之间,跟C语言一样, Swifit只有一个三元运算符,语法是a ? b:c。
运算符影响的是结果值,例如表达式1+2,+是二元运算符,它操作的2个数是1和2。
赋值运算符(+)
当赋值运算符用在表达式a=b时, 这句代码的含义是给变量a赋初值b, 或更新变量a的值为b。
-
let b = 10 var a = 5 a = b //变量a的值是10
如果等号的右边是具有多个值的元组,它的元素可以被分解成多个常量或变量:
-
let (x,y) = (1,2)
-
// 变量x是Int型,值为1; 变量y是Int型,值为2
- 说明:在Java/C语言中没有类似语法。
跟C/Java的赋值运算符(=)不同的是, Swift在if语句中使用赋值运算符,该句代码无效, Xcode会提示错误。
var x = 1, y =1
if x ==y {
// true, do something
} else {
// false
}
算法运算符:
Swift对所有数字类型支持4种计算运算符,加(+)、减(-)、乘(*)、除(/)。
1 + 2 // 等于 3
5 - 3 // 等于 2
2 * 3 // 等于 6
10.0 / 2.5 // 等于 4.0
- 跟C/Object-C不同的是,Swift不允许出现值溢出的情况; 如果要处理值溢出的情况, Swift提供了溢出运算符, 例如a &+ b, 在后续章节会详细介绍。
"hello, " + "world" // 等于 "hello, world"
-
取余运算符%
跟Java/C/OC功能、用法一样, %会得到整除后剩下的数值。语法是 a%b, 例如9%4等于1。
减号运算符-
跟Java/C/OC功能、用法一样, -会得到两个参数的差值,或者对一个值取负数。
let three =3
let minusThree = -three // minusThree 等于 -3
let plusThree = -minusThree // plusThree 等于 3, 即负负为正
注意:取负数时减号在参数前面, 中间没有空格。
加法运算符+
跟Java/C/OC功能、用法一样,+会得到两个参数的和, 单独写在变量前时无任何作用(区别于-)。
let minusSix =-6 let alsoMinusSix = +minusSix // alsoMinusSix 仍然是 -6
跟Java/C/OC功能、用法一样, 复合赋值运算符会先将两边参数求和后赋值给左边参数。
var a =1
a += 2 // a 等于 3
- 表达式a += 2等同于a = a + 2, 一个运算符执行了2个操作, 即求和和赋值。
比较运算符:
Swift只有所有的C语言比较运算符
是否相同 (a == b)
是否不同 (a != b)
大于 (a > b)
小于 (a < b)
大于等于 (a >= b)
小于等于 (a <= b)
1 == 1 // true
2 != 1 // true
2 > 1 // true
1 < 2 // true
1 >= 1 // true
2 <= 1 // false
比较运算符常常用在逻辑分支判断语句, 例如if后面。
// 输出 "hello, world", name是String类型, 判断是否相同可以使用==。 而在Java里要使用String的equals方法, 如果是在Java里name == "world"的含义是判断参数name指向的地址跟“world”是否相同。
let name ="world"
if name =="world" { //注意:字符串判断是否相同可以使用==
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you")
}
上述操作符还可以用在相同参数数量的元组, 比较元组中的各个值, 按照由前向后的顺序比较, 跟逻辑与的逻辑类似。
(1,"zebra") < (2,"apple")// true 因为1小于2; "zebra" 和 "apple" 不需要比较了
(3,"apple") < (3,"bird")// true 因为3等于3, 所以要比较第2个值,"apple"小于"bird", 按照字母顺序。
(4,"dog") == (4,"dog")// true 因为4等于4, 而且第2个值 "dog"与"dog"相等
无合并运算符?? (Swift独有)
var colorNameToUse =userDefinedColorName ?? defaultColorName
print("colorNameToUse:"+colorNameToUse) //输出 "colorNameToUse:red"
// userDefinedColorName等于nil,所以会将defaultColorName的值赋给colorNameToUse,即"red"
userDefinedColorName = "blue"
var colorNameToUseExt = userDefinedColorName ??defaultColorName
print("colorNameToUseExt:"+colorNameToUseExt) //输出 "colorNameToUseExt:blue"
注意: 无合并运算符只能使用在可选Optional参数类型后面!!
无合并运算符(a ?? b)获取Optional类型参数a的值,如果参数a有值则取值给参数a(相当于a = a!); 如果参数a没值,则赋值b给a。
a ?? b 等同于 a != nil ? a! : b
-
// userDefinedColorName有值blue, 所以会取出useDefinedColorName的值赋给colorNameToUseExt, 即"blue"
区间运算符 a...b
范围运算符(a...b) 定义了从a到b的范围[a,b], 包含值a和b, a必须小于b。 区间运算符可以用在你想遍历所有值时,例如for-in循环。
for index in1...5 { //相当于 1 <= index && index <= 5
print("\(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
let names = ["Anna","Alex","Brian","Jack"]
let count =names.count
for i in 0..<count {
print("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
for i in 0..<0 {
print("Person\(i +1) is called \(names[i])")
}
//无输出
单边操作符: 即只有一个数字, 另一边是不限制。 PS: 注意上标越界。
let names = ["1", "2", "3", "4", "5"]
for name in names[..<3] {
print(name) // 1 2 3
}
for name in names[...3] {
print(name) //1 2 3 4
}
for name in names[2...] {
print(name) //3 4 5
}
let range = ...5 //单边区间
range.contains(5) //true
range.contains(1) //true
range.contains(6) //false
逻辑运算符: 跟Java/C/OC一样
-
取反 (
!a
) -
逻辑与 (
a && b
) -
逻辑或 (
a || b
)
说明: 因为跟其它语言完全一样, 就不解释了。
=== 是比较类型和值