4.1 初识运算符
运算符的作用在于将量值或者表达式结合在一起进行计算。Swift语言中的运算符按照其操作数的个数可以分为3类,分别为:
- 一元运算符:一元运算符作用于一个操作数,其可以出现在操作数的前面,例如正负运算符“+”“-”,逻辑非运算符“!”。
- 二元运算符:二元运算符作用于两个操作数之间,例如加减运算符“+”“-”等。
- 三元运算符:三元运算符作用于三个操作数之间,经典的三元运算符有问号、冒号运算符,其可以方便地实现简单的判断选择结构。
4.1.1 赋值运算符
赋值运算符应该是在编程中出现频率最高的运算符之一,在对任何量值进行赋值时,都需要使用到赋值运算符“=”。需要注意,“=”在Swift语言中是赋值运算符,并不是相等运算符,对于一些编程初学者,很容易将相等运算符“==”与赋值运算符“=”混淆使用。使用Xcode开发工具创建一个名为Operational的Playground文件,赋值运算符示例如下:
//字符串赋值 var str = "Hello, playground" //整型赋值 var count = 5 //元组赋值 var group = (1,2,"12") //Bool赋值 var bol = true
如果要将一个元组中的值依次赋给指定的量值,Swift中还支持使用解构赋值的语法来进行赋值,示例如下:
// 进行解构赋值 var (n1, n2, n3) = (1, 2, 3) print(n1, n2 ,n3) // 1, 2, 3
提示
赋值运算符用于值的传递,其结果是量值被赋了具体的值。相等运算符则用于比较操作,其会返回一个Bool类型的逻辑值。
4.1.2 基本算术运算符
基本算术运算符用于进行一些基本的数学运算,例如加、减、乘、除等。需要注意,Swift语言从2.2版本之后,删除了自增运算符“++”与自减运算符“--”,目前版本的Swift语言中不可以使用这两个运算符。Swift中支持的基本算术运算符示例如下:
//相加运算 1+2 //相减运算 2-1 //相乘运算 2*2 //相除运算 4/2 //取余运算 4%3
提示
取余运算符必须在整数间进行运算时使用。
将赋值运算符与基本算术运算符结合使用可以组合成复合赋值运算符,复合赋值运算符可以在一个表达式中完成一项基本运算与赋值的复合操作,示例如下:
var tmp=1 //加赋值复合运算 tmp+=3 //tmp = tmp +3 //减赋值复合运算 tmp-=3 //tmp = tmp -3 //乘赋值复合运算 tmp*=3 //tmp = tmp *3 //除赋值复合运算 tmp/=3 //tmp = tmp /3 //取余赋值复合运算 tmp%=3 //tmp = tmp %3
除了上面提到的运算符外,正负运算符和数学中的正负号作用类似,负运算符会改变数据的正负性,正运算符会保持数据的正负性。示例如下:
var a = 1 var b = -2 +b //-2 -a //-1
提示
自增与自减运算符在Swift 2.2及之前版本可以使用,Swift 2.2版本后,基于代码的可读性与减少歧义的考虑,移除了这两个运算符。
4.1.3 基本逻辑运算符
基本算术运算符进行数学上的算术操作,基本逻辑运算符进行逻辑运算操作。可以简单理解为,逻辑运算就是生活中所定义的真与假。系统定义的基本逻辑运算符会返回一个Bool类型的逻辑值,因此,基本逻辑运算符组成的逻辑表达式在if判断语句中经常会用到。
Swift中支持的基本逻辑运算符有:逻辑与运算符“&&”、逻辑或运算符“||”、逻辑非运算符“!”三种,逻辑运算只在逻辑值(Bool类型值)之间进行,与、或、非三种运算中前两者为二元运算符,需要有两个Bool类型的操作数,非运算符为一元运算符,需要有一个Bool类型的操作数。这三种运算符有如下特点:
- 与:两个操作数都为真,结果才为真,有一个操作数为假,则结果为假。
- 或:两个操作数有一个为真,则结果为真,两个操作数都为假,则结果为假。
- 非:操作数为真,则结果为假,操作数为假,则结果为真。
示例如下:
var p1 = true var p2 = false //与运算 false p1&&p2 //或运算 true p1||p2 //非运算 false !p1
提示
与Objective-C语言不同,Swift语言中逻辑运算的操作数必须为严格的Bool类型。
4.1.4 比较运算符
Swift中的比较运算符用于两个操作数之间的比较运算,其会返回一个Bool类型的逻辑值。基本的比较运算符有:等于比较运算符“==”、小于比较运算符“<”、大于比较运算符“>”、不等于比较运算符“!=”、小于等于比较运算符“<=”以及大于等于比较运算符“>=”。示例如下:
1==2 //等于比较,返回false 1<2 //小于比较,返回true 1>2 //大于比较,返回false 1 != 2 //不等于比较,返回true 1<=2 //小于等于比较,返回true 1>=2 //大于等于比较,返回false
Swift中对于元组的比较操作读者需要注意:首先要比较的元组中的元素个数和对应位置的元素类型必须相同,其次元组中每一个元素必须支持比较运算操作,示例代码如下:
var tp1 = (3,4,"5") var tp2 = (2,6,"9") var tp3 = ("1",4,5) tp1<tp2 //将返回false
上面的代码中,元组实例tp1与元组实例tp2中的元素个数和对应类型相同,且所有元素都支持比较运算操作,所以tp1与tp2可以进行比较运算。tp1与tp3虽然元素个数相同,但是tp1的第1个元素为整型,tp3的第一个元素为字符串类型,类型不同,所以不能进行比较运算。Swift在进行元组间的比较运算的时候,会遵守这样一个原则:从第1个元素开始比较,如果比较出了结果,则不再进行后面元素的比较运算,直接返回结果Bool值,如果没有比较出结果,那么继续依次比较后面的元素,直到比较出结果为止。
4.1.5 条件运算符
条件运算符(三目运算符)是一种三元运算符,其可以简便实现代码中的条件选择逻辑。例如如下代码为一个简单的条件选择语句示例:
上面的代码对变量m和n进行了比较,并将比较结果进行打印,如果使用条件运算符,上面的逻辑可以简写成如下模样:
print(m>n ? "m>n":"m<=n")
上面的代码在语法上可以简化为这样的格式:条件?成立的代码:不成立的代码。
可以看到,条件运算符(三目运算符)只使用了一句代码就完成了if-else结构需要多句代码才能完成的工作,其编写效率很高。我们来分解一下条件运算符的组成结构,首先条件运算符需要有3个操作数,其中第1个操作数必须为一个条件语句或者一个Bool类型的值,第2个和第3个操作数可以是任意类型的值或者一个有确定值的表达式,3个操作数由问号“?”和冒号“:”进行分割,当问号前的操作数值为真时,条件运算符运算的结果为冒号前的操作数的值,当问号前的操作数值为假时,条件运算符运算的结果为冒号后的操作数的值。