6.3 运算符的优先级与结合性
在小时候学习数学时,老师总会强调四则运算中的先乘除后加减、从左向右计算等规则。其实在Swift语言编程中,也有这样的规则存在。例如,进行如下混合运算:
从上面的演示代码中可以看出,Swift语言中的四则运算也是先进行乘除运算,后进行加减运算,运算顺序为从左向右。其实在Swift语言的运算符体系中,有着优先级与结合性的概念,运算符的优先级决定同一行代码中出现多种运算符时的计算顺序,运算符的结合性决定运算符是从左向右运算还是从右向左运算。任何运算符都有默认的优先级,开发者自定义的运算符也是如此,优先级越高的运算符越优先执行。对于结合性而言,由于前缀运算符与后缀运算符都只有一个操作数,因此它只对中缀运算符有意义。
表6-1和表6-2列出了Swift中所有运算符的相关信息。
表6-1 Swift语言中的系统前缀运算符
表6-2 Swift语言中的系统中缀运算符
表6-1和表6-2列举了Swift语言系统定义的所有运算符相关信息,无须专门记忆,在实际开发中需要使用时再来查表即可。其实更多情况下,开发者会直接使用小括号来决定表达式的执行顺序,这样代码会更加直观。
在重载运算符操作中,并不会改变原运算符的结合性和优先级,但对于自定义运算符,开发者可以设置其结合性与优先级,示例如下:
如以上代码所示,其中precedencegroup关键字用来定义运算符的优先级组。在自定义优先级时,我们可以为其设置一个优先级组,系统默认内置了非常多的优先级组,如加法运算符优先级组、乘法运算符优先级组、位运算符优先级组等,我们可以直接使用,例如:
// 定义中缀运算符,其优先级属性要与系统的加法相关运算符一致 infix operator ++++:AdditionPrecedence
当系统内置的优先级组不能满足我们的要求时,即可使用precedencegroup关键字来自定义优先级组,其中higerThan用来定义当前优先级组的优先级比哪个优先级组高,lowerThan用来定义当前优先级组的优先级比哪个优先级组低,assignment用来设置是否会影响可选链赋值运算中的优先级判定规则,associativity用来设置可以选择left或者right来定义成左结合性或者右结合性,设置为none则为默认结合性。