一、简介
运算符是检查、改变、合并值的特殊符号或者短语。在本篇文章中只介绍基本运算符,Swift中包含的高级运算符(比如溢出运算符)不在其中。Swift中的运算符和OC中的运算法还是有比较大的区别的,Swift语言这样做的目的是减少常规编码错误。
二、术语
运算符分为一元、二元和三元运算符。
一元运算符分为前置运算符和后置运算符。
受运算符影响的值叫操作数,在表达式1 + 2中,加号(+)是二元运算符,它的两个操作数是值1和值2。
三、Swift和OC的对比
Swift | OC | 附加说明 |
= | = | Swift与OC不同,Swift的赋值操作不返回任何值 |
+、-、*、/、-=、+= | +、-、*、/、-=、+= | Swift中的+可以拼接String |
==、!=、>、<、>=、<= | ==、!=、>、<、>=、<= | 比较运算符可以作用于Swift中的元组 |
问题 ? 答案1 : 答案2 | 问题 ? 答案1 : 答案2 | 特殊情况下的三目运算符可以用空合运算符简化 |
?? | 无 | Swift中的空合运算符是为optional类型所产生的 |
a...b、a..<b | 无 | OC中并没有对应的区间运算符 |
!、&&、|| | !、&&、|| | 与OC使用一致 |
四、Swift基本运算符的介绍
1、赋值运算符(=)
·这里只需要注意的是Swift与C语言和OC不同,Swift的赋值运算符操作并不返回任何值。
说明:这个特性使得你无法把(==)错写成(=),由于if x = y是错误代码,Swift能帮你避免此类错误的发生。
2、算术运算符(+)
·Swift中所有的数值类型都支持基本的四则算术运算符:加法(+)、减法(-)、乘法(*)、除法(/)
·Swift中的加法运算符还可以用于String的拼接,OC中没有这个特性
·Swift默认情况下不允许在数值运算中出现溢出情况(当然在高级运算符中有溢出运算符来实现溢出运算)。但是OC中是没有这个检查的
3、求余运算符(%)
·求余运算和取模运算是不一样的结果。严格的定义请根据数学上的定义区分
例如计算:-7 Mod 4
那么:a = -7;b = 4;
第一步:求整数商c,如果进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入)
第二步:因为c的值不同,求模时r = 1,求余时r = -3
·为了比较好记忆求余运算的方式,使用a = (b * 倍数) + 余数,当b的最大多少倍刚好能够容入a时,此时的余数就是求余运算的结果
9 % 4
//9 = (4 * 倍数)+ 余数,当倍数等于2时,8刚好容入9,此时余数为1
-9 % 4
//-9 = (4 * 倍数) +余数,当倍数等于-2时,-8刚好容入-9,此时余数为-1
9 % -4
//9 = (-4 *倍数)+余数,当倍数等于-2时,8刚好容入9,此时余数为1
4、一元负号运算符(-)
·一元运算符与操作数之间不要有空格
5、一元正号运算符(+)
·一元运算符与操作数之间不要有空格
6、组合赋值运算符(+=、-=)
·先后完成两个运算任务
7、比较运算符(==、!=、>、<、>=、<=)
·因为Swift中增加了元组数据类型,元组也可以使用比较运算符,采用的是从左到右依次比较,当左边的比较相等才进行右边的比较,以此类推。但是Swift标准库只能比较7个以内元素的元组比较函数。如果元组元素超过7个时,需要自己实现比较运算符。
·Int和String等类型可以比较,Bool类型不能比较。
8、三目运算符(问题 ? 答案1 : 答案2)
·跟OC中的使用一致
9、空合运算符(??)
·空合运算符是根据Swift中出现的可选类型而出现的在特殊情况下对三目运算符的一种简写。
·空合运算符(a ?? b)将对可选类型进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b。表达式a必须是Optional类型。默认值b的类型必须要和a存储值的类型保存一致。
let defaultColorName = "red"
var userDefinedColorName: String?
var colorNameToUse = a != nil ? userDefinedColorName : defaultColorName
等价于
var colorNameToUse = userDefinedColorName ?? defaultColorName
10、区间运算符(a...b、a..<b)
·闭区间运算符(a...b)定义一个包含从a到b(包括a和b)的所有值的区间。
·半开区间运算符(a..<b)定义一个从a到b但不包括b的区间。
·使用场景经常在for in循环中出现
let names = ["Anna", "Alex", "Brain", "Jack"]
let count = names.count
for i in 0..<count {
//
}
11、逻辑运算符(!、&&、||)
·逻辑非 、逻辑与、逻辑或,三个逻辑运算符跟OC中的使用保持一致
·不管是Swift还是OC,逻辑操作符&&和||都是在左结合的,这意味着拥有多元逻辑操作符的符合表达式优先计算最左边的子表达式。当然,对于复杂表达式,使用括号来明确优先级更加容易读懂。