【主要内容】
1. 术语
2. 赋值运算符
3. 算术运算符
4. 组合赋值运算符
5. 比较运算符
6. 三目运算符
7. 空合运算符
8. 区间运算符
9. 逻辑运算符
前言:
Swift支持绝大部分的C语言运算符,而且Swift改进了很多特性减少编码的失误,比如:
1. 最常用的就是赋值符号(=)不返回值,防止你把想要判断相等(==)的时候少写一个等号。
2. 算术运算符会提前检测值溢出的情况。
3. Swift中浮点数也可以取余(%)运算。
4. 比C语言多了表示两个数区间的运算符a..<b和a...b
一、 术语
运算符分为一元、二元、三元运算符:
1. 一元运算符就是只操作一个对象(如 -a)。一元运算符分前置运算符和后置运算符,前置运算符跟在操作对象之前(如 !b),后置运算符跟在操作对象之后(如 c!)。
2. 二元运算符操作两个操作对象(如 2 + 3),是中置的,因为它们出现在两个操作对象之间。
3. 三元运算符操作三个操作对象,和 C 语言一样,Swift 只有一个三元运算符,就是三目运算符(a ? b : c)。
二、 赋值运算符
赋值运算符(a = b),表示用b的值来初始化或更新a的值:
元组也可以进行赋值:
在Swift中赋值运算符最好的一点是没有返回值,这样可以避免if判断中的低级错误,比如:
在C和Objective-C中这样的代码可以编译通过,但是Swift中会提前报错。
三、 算术运算符
3.1 基本算数运算符
Swift中所有数值类型都支持基本四则运算:
- 加法"+"
- 减法"-"
- 乘法"*"
- 除法"/"
注意:
Swift比C语言和Objective-C好的一点是,不允许在数值运算的时候结果溢出,例如Int8类型表示的值的范围:-128 ~ 127, 为此如果两数进行运算超过这个范围就会报错:
另外加法(+)运算还可以用于字符串的拼接:
3.2 取余运算符
3.2.1 整型数的取余运算: 取余运算(a % b)是我们小学学过的余数的概念:a除以b余几。这个余数就是(a % b)的值,比如:
我们在计算9对4取余的值时候是先计算出4的多少倍会刚好融入9中,如下图:
3.2.2 浮点型的取余运算:
在Swift 2.0中支持浮点型取余运算,我用的Xode8 + Swift3.0好像已经不支持浮点型取余运算
3.2.3 一元负号运算符:
数值的正负号可以使用前缀 “-”(一元负号)来切换:
注意:
一元负号(-)写在操作数之前,不用空格。
3.2.4 一元正号运算符:
一元正号(+)不做任何改变的返回操作数的值:
虽然一元正号(+)什么都不会改变,但当你在使用一元负号来表达负数时,你可以使用一元正号来表达正数,这个代码比较美观对称。
四、 组合赋值运算符
和C、Objective-C一样,Swift也支持把其他运算符(+ - * /)合赋值运算符(=)组合到一起的组合赋值运算符,来看下边的栗子:
组合赋值运算符的实质是:把一个加/减/乘/除(+ - * /)运算和赋值(=)运算组合到一起。比如 x += y,实质是x = x + y。
注意:
复合赋值运算没有返回值,下边这个栗子会报错:
五、 比较运算符
C语言中的比较运算在Swift中都可以使用:
以a,b为例:
- 等于:(a == b)
- 不等于:(a != b)
- 大于: (a > b)
- 小于:(a < b)
- 大于等于:(a >= b)
- 小于等于:(a <= b)
- 恒等:(a === b)
- 不恒等:(a !== b)
注意:
1. Swift也提供恒等(===)和不恒等(!==)用来判断两个对象是否引用同一个对象实例。
2. 每个比较运算的结果都会返回一个布尔值类型比较结果,比较运算符多用于条件语句。
元组的值也是可以比较的,因为Int和String类型的值可以比较,所以类型为(Int,String)类型的元组可以比较大小。Bool类型的元组不能比较。
比较元组的大小会按照从左到右、逐个比较的方式,知道发现有两个值不等时停止:
元组(27,"Lamborghini")和元组(27 , "Farrari")的第一个元素值相等,然后回去比较第二个元素。大写字母L的ASCII值是76,F的值是70,所以元组(27,"Lamborghini")>(27 , "Farrari")因此max返回的Bool值是true。
六、 三目运算符
三目运算符跟C语言一样,格式:表达式?值1:值2,当表达式成立的时候(ture)返回值1的结果,反之返回值2的结果。
举个栗子,在自定义cell的有的地方有图片有的地方没有,这个时候需要判断每个cell是否包含图片,如果包含图片高度需要增加50px,如果不包含就增加10px,用三目运算符表示:
使用三目运算符能让我们程序更加简洁。但凡是都有个度如果程序中使用过多的三目运算符会让代码变的难懂。
七、 空合运算符(Nil Coalescing Operator)
空合运算符(a ?? b)将对可选类型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认的值b。表达式a必须是Optional类型,默认值b的类型必须要和a储存值的类型保持一致。
举个栗子:
上图中userSelectColor是一个可选的String类型,初始值是nil。常量colorName的初始值由空格运算符(??)计算得来,当userSelectColor的值不会空的时候就使用userSelectColor的值,反之使用defaultColor的值。
其实空格运算符(??)相当于一个优雅的三目运算符,用三目运算符这么写:
let colorName = userSelectColor != nil ? userSelectColor! : defaultColor
八、 区间运算符
Swift提供了两种表示区间的值的运算符。
8.1 闭区间运算符
闭区间运算符(a...b)定义了一个包含从a到b(包括a和b)的所有值的区间,a的值不能超过b。闭区间运算符在迭代一个区间的所有值的时候非常有用,比如在for-in遍历时:
8.2 半开区间运算符
半开区间(a..<b)定义一个从a到b但不包括b的区间,半开区间包含第一个值而不包含最后一个值。
半开区间可以用于遍历数组中的元素,因为数组下标总是比数组元素小1,举个栗子:
九、逻辑运算符(Logical Operators)
逻辑运算的操作对象是布尔值。Swift支持C语言的三个标准逻辑运算:
- 逻辑非(!a)
- 逻辑与(a && b)
- 逻辑或(a || b)
9.1 逻辑非
逻辑非运算(!a)对一个布尔值取反。让true变成false,让false变成true。
它是一个前置运算符,需要紧跟在操作数之前且不加空格。读作非a,举个栗子:
9.2 逻辑与
逻辑与(a && b)表达了只有a和b的值都为true时,整个表达式的值才是true。也就是:一假即为假
只要任意一个值为false,整个表达式的值就为false。如果第一个值为false,那么就不在计算第二值,因此针对这种短路计算(short-circuit evaluation)开发的时候要把尽可能值为false的表达式往前放。
举个栗子:
9.3 逻辑或
逻辑或(a || b)只要两个表达式中的其中一个为true,整个表达式就为true。逻辑或也属于短路计算,是一真即为真。
举个栗子,第一个值为false,第二个值为true,整个表达式结果仍为true:
9.4 逻辑运算符组合使用
我们可以组合多个逻辑运算来表达一个复合逻辑:
注意:
Swift逻辑操作符&&和||是左结合的,也就是优先结合最左边的表达式。
9.5 使用括号来明确优先级
在一些表达式非常复杂的情况下,我们可以使用括号来明确优先级,而且是代码更易读。加括号并非必要的,但是加上会是代码意图更加明确:
括号使整个表达式变成了两个部分,代码意图更加清晰,代码更易读。
欢迎大家关注“芒果iOS”微信公众账号,芒果会经常为大家分享好的技术文章: