Swift 基本运算符

赋值运算符

//赋值符可以赋值元组
let (x, y) = (1, 2)
// 现在 x 等于 1,y 等于 2

注意点:
与OC不同,赋值符不返回值,防止把想要判断相等运算符( == )的地方写成赋值符导致的错误

算术运算符

1 + 2       // 等于 3
5 - 3       // 等于 2
2 * 3       // 等于 6
10.0 / 2.5  // 等于 4.0

//加法运算符也可用于 String 的拼接
"hello, " + "world" // 等于 "hello, world"

注意:
OC不同,Swift默认情况下不允许在数值运算中出现溢出情况.(可以使用Swift提供的溢出运算符实现溢出运算)

求余运算

求余运算(%)在其他语言也叫取模运算

一元负号/正号运算符

一元负/正号符( -/+ )写在操作数之前,中间没有空格。
负号或者正号可以抵消

组合赋值运算符

例如:
a += 2 //这组合赋值运算符也是没有返回值的(和赋值运算符一样)

在Swift3 中已经移除了 ++ 或 -- 的自增 自减运算符

组合赋值运算符也没有返回值的 因此let b = a += 2的写法是错误的

比较运算符

和OC中是相同的,返回一个表达式是否成立的布尔值

Swift 也提供恒等(===)和不恒等(!==)这两个比较符来判断两个对象是否引用同一个对象实例

注意:

元组的比较方法:
当元组中的值可以比较时,你也可以使用这些运算符来比较它们的大小。例如,因为IntString类型的值可以比较,所以类型为(Int, String)的元组也可以被比较。相反,Bool 不能被比较,也意味着存有布尔类型的元组不能被比较

比较元组大小会按照从左到右、逐值比较的方式,直到发现有两个值不等时停止。如果所有的值都相等,那么这一对元组我们就称它们是相等的

//当比较到1小于2就判断为ture 不会再比较下去
(1, "zebra") < (2, "apple") // true,因为 1 小于 2
(3, "apple") < (3, "bird") // true,因为 3 等于 3,但是 apple 小于 bird
(4, "dog") == (4, "dog") // true,因为 4 等于 4,dog 等于 dog

Swift 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。

三元运算符

空合运算符

空合运算符(a ?? b)将对可选类型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b
表达式a必须是Optional类型
默认值b的类型必须要和a存储值的类型保持一致。

空合运算符相当于

a != nil ? a! : b

注意:

空合运算符也采用了短路求值,即当a为非空时,那么就不会再去计算b的值

区间运算符

闭区间运算符

a...b定义一个包含从a到b(包括a和b)

for index in 1...5 {
    print("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25

半开区间运算符

a..<b定义一个从ab但不包括b的区间

单侧区间

闭区间运算符 有另外一种表达形式,可以表示向一次无限延伸的区间。

例如: 包含了数组从索引2到结尾所有值的区间。

Anna、Alex、Brian、Jack

for name in names[2...] {
    print(name)
}
// Brian
// Jack

for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian

类似的,半开区间操作符也有单侧表达形式,附带它的最终值,最终值并不会落在区间内。

for name in names[..<2] {
    print(name)
}
// Anna
// Alex

注意

不能遍历省略了初始值的单侧区间,因为这样遍历的开端并不明显。但是可以遍历一个省略了最终值的单侧区间,但是由于这种区间的无限延伸特定,请确保循环中存在结束的条件或分支

逻辑运算符

&&||!

与或非运算也是使用短路计算的

注意:
Swift逻辑操作符 &&|| 是左结合的,即从左向右读,优先计算左边,建议加上括号来增加代码可读性