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
也提供恒等(===
)和不恒等(!==
)这两个比较符来判断两个对象是否引用同一个对象实例
注意:
元组的比较方法:
当元组中的值可以比较时,你也可以使用这些运算符来比较它们的大小。例如,因为Int
和String
类型的值可以比较,所以类型为(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
定义一个从a
到b
但不包括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
逻辑操作符 &&
和 ||
是左结合的,即从左向右读,优先计算左边,建议加上括号来增加代码可读性