重读 Swift 之二:Operator Declaration(运算符重载)

423 查看

一、为什么要重载运算符


我们都知道所谓的运算符平常的也就是 + - * / 之类的,比如我们随便写个 1 + 2 打印肯定输出的是 3 ,那么我们为什么还要重载运算符呢?下面我们就举个例子,如下我定义个结构体

然后我们定义两个变量 V1,V2

然后我们来写V1 + V2,报错

11571495-ed690fe1f87cda52

error

报错 + 不能用于 Vector,这是因为 Vector 使我们自定义的一个结构体,所以编译器不知道我们要用 + 对这个结构体做什么操作。因此,在这里我们就需要用到运算符的重载。

二、如何重载运算符


  • 1、含有两个参数的运算符的重载
    因为运算符是一个函数,比如对于数组的 reduce方法我们就可以如下

    结果是 10 ,这里的 +就代表了一个函数,所以我们重新写的时候可以如下

    这样我们就实现了 + 的重载,上面函数中 left 和 right 两个参数都是 Vector 类型的,一个表示运算符左边的参数一个表示运算符右边的参数(这两个参数是有先后顺序的,由于加法满足加法交换律所以这里体现不出来,有兴趣的可以试一下 - 的重载,这时候就要注意顺序了),然后返回值得类型也是 Vector 类型,再来实现V1 + V2的时候,就发现得到了一个新的 Vector 类型的值

12571495-7743fd3f2d5a3a4e

V1 + V2

这里我们就已经完成了 + 这个运算符的重载。当然有兴趣的童鞋还可以试着自己实现 - 或者 * 的重载,这里就不一一举例了。
关于双目运算符的重载,和单目运算符类似,如下

运行结果

13571495-407bf897c0229ca7

V1
  • 2、含有一个参数的运算符的重载
    照着上面单目运算符的方式我们自己来写个 - 重载例子,如下

    按照我们的逻辑这里取反逻辑上应该是正确的,可是编译会发现报错

14571495-5e066ede422ddd2e

error

这里我们就要注意了,和有两个参数的运算符不同的是,只有一个参数的运算符位置是不固定的,这里的 - 可以在前可以在后,所以我们在这里还需要注意运算符的位置