Ziank的技术博客

swift的操作符重载

今天简单说一下操作符重载的相关知识吧,希望对自己和别人能够有所帮助。相信懂得C++的同学对于运算符重载并不陌生,在swift中也是支持重载运算符这种特性的。

操作符重载的好处无需多说,相信大家都明白。那么我们在swift应该如何重载操作符呢?其实很简单,和C++基本一样,只需要添加对应的函数实现就可以了。

例如我们重载加号操作符的话:

1
2
3
func +(left:CalcNode, right: CalcNode) -> CalcNode {
return CalcNode(number:left.value + right.value)
}

但是,和C++中得运算符冲在不同的是,如果要使用新增的运算符的话,还需要在函数重载之前对该操作符进行声明。

1
2
3
4
5
6
7
8
9
10
infix operator ** {
associativity left
precedence 160
}
func ** (left: Double, right: Double) -> Double {
return pow(left, right)
}
2 ** 3
// 8

上述代码就是声明了一个中位操作符+*,后面就可以添加对应的重载函数实现该运算符的具体操作。
我们先说一下几个关键字的具体作用吧:

  • infix/prefix/postfix: 分别用来表示中位操作符、前位操作符和后位操作符。其中infix说明操作符前后都是输入。
  • associativity:
    定义了结合律,即如果多个同类的操作符顺序出现的计算顺序, left,就是说多个操作同时出现时按照从左往右的顺序计算

  • precedence:
    运算的优先级,越高的话越优先进行运算。Swift 中乘法和除法的优先级是 150,加法和减法是 140,这里我们定义乘方的优先级为 160,就是说应该早于普通的乘除进行运算。

其中associativity和precedence都是swift的中位运算符的一些属性修饰。如果是前位/后位运算符的话,则不能够实用这些属性来进行修改。

简单地举个prefix的示例:

1
2
3
4
5
6
7
prefix operator √ {}
prefix func(number: Double) -> Double {
return sqrt(number)
}
4
// 2

需要注意的是:

运算符重载函数只能够定义在全局作用域。

附< swift中的常用操作符 >:

Prefix:


++: Increment
: Decrement
+ : Unary plus
- : Unary minus
! : Logical NOT
~ : Bitwise NOT

Postfix:


++: Increment
: Decrement

Infix:

Exponentiative {precedence 160}
<<Bitwise left shift
>>Bitwise right shift
Multiplicative { associativity left precedence 150 }
Multiply
/Divide
%Remainder
&Multiply, ignoring overflow
&/Divide, ignoring overflow
&%Remainder, ignoring overflow
&Bitwise AND
Additive { associativity left precedence 140 }
+Add
-Subtract
&+Add with overflow
&-Subtract with overflow
|Bitwise OR
^Bitwise XOR
Range { precedence 135 }
..<Half-open range
Closed range
Cast { precedence 132 }
isType check
asType cast
Comparative { precedence 130 }
<Less than
<=Less than or equal
>Greater than
>=Greater than or equal
==Equal
!=Not equal
===Identical
!==Not identical
~=Pattern match
Conjunctive { associativity left precedence 120 }
&&Logical AND
Disjunctive { associativity left precedence 110 }
||Logical OR
Nil Coalescing { associativity right precedence 110 }
??Nil coalescing
Ternary Conditional { associativity right precedence 100 }
?:Ternary conditional
Assignment { associativity right precedence 90 }
=Assign
*=Multiply and assign
/=Divide and assign
%=Remainder and assign
+=Add and assign
-=Subtract and assign
<<=Left bit shift and assign
>>=Right bit shift and assign
&=Bitwise AND and assign
^=Bitwise XOR and assign
|=Bitwise OR and assign
&&=Logical AND and assign
||=Logical OR and assign