1. 运算符的重载
1.1 基本运算符的重载
1 | func * (lhs: String, rhs: Int) -> String { |
如上所示,我们重载了运算符 *
。再看看另一个例子:
1 | struct Vector2D { |
我们定义了如上的结构体,如果想把两个 Vector2D
类型的实例相加,编译器是会报错的。如果我们重载操作符 +
,就可以实现相加:
1 | func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D { |
1.2 泛型运算符
1 | func * <T> (lhs: T, rhs: Int) -> T { |
按照常理,我们会将第一个例子做如上改写,但是编译器会提示 Binary operator ‘+=’ cannot be applied to two ‘T’ operands ,这是因为 T
类型并不能直接使用加法符合运算符,我们可以通过让 T
类型遵循实现了加法功能的协议来解决这个问题,改写后的代码如下:
1 | protocol Type { |
2. 运算符的自定义
先介绍 Swift 中的三个关键字:
prefix
:前缀运算符,比如++i
中的++
postfix
:后缀运算符,比如i++
中的++
infix
:中缀运算符,比如a + b
中的+
这里仅以 infix
为例示范其用法,现在我们自定义一个运算符 **
和符合运算符 **=
,实现第一个例子的功能。
1 | infix operator ** |
至此,运算符的重载和自定义的基本功能就介绍完毕了。当然,自定义运算符同样是可以定义优先级和结合性的,这里不做过多讲解,有兴趣的朋友可以自行查阅资料。