Swift重载运算符

[TOC]

Swift重载运算符

运算符重载允许你改变现在的作用在特定在的结构体和类上的已经存在的操作符的工作方式.他意味着你可以赋予+ - += -= 这些符号别的功能,当然功能的确定还是靠你的重写.

  • 简单的运算符重载:
    假设我们重载的运算符是 *

func *(inout lhs: Int, rhs: Int) {

    print("log")

    lhs = lhs * rhs

}
  • 实质上我们只是重写了一下Int类型的乘法,并且在其中打印了一句话.这样就完成了一次重写.但是,这样的重载运算符可能区分度不够明显,或许你的开发小伙伴并不希望重写这个Int类型的乘法.
    Okay,为了满足他.我们可以引用中缀运算符(infix).

例如 ** .


infix operator ** {associativity left precedence 150}

func **=(inout lhs: T, rhs: Int) {

    print("** eqaul to *")

    lhs = lhs ** rhs

}

上图的 自定义的中缀运算符(infix), associativity left代表运算规则自左向右, precedence 150 意味着他的运算优先级和 *一样高.

细心的小伙伴可能会发现,这里的lhs 所对应的是泛型, 那么如何重载泛型的运算符呢?

  • 这时候 Swift的协议就起到了至关重要的作用.

protocol Digit {

    func -=(inout l: Self, r: Self)

//    func +(l: Self, r: Self)

}

extension Int: Digit {}

extension Double: Digit {}

extension Float: Digit {}

  • 我们制定了一个数字的协议,并且让Int, Double, Float都遵循这个协议,那么这个泛型就可以应用了.
    但是如果我们想让String也遵循这个协议,则需要重写一个String与Int, Double, Float 能共同实现遵循的协议一个方法, 例如 + 或者 += ,而 -= 或者 - 这些String并不能遵循,所以是不能写在协议里面的.
  • inout 的作用: 标记那些值要被修改并且最后被函数返回的(即此值可以在函数内部被修改, 让值以引用类型传递).

你可能感兴趣的:(Swift重载运算符)