Swift 中的操作符(让你的1+1=3)

2018-07-13  本文已影响0人  小_黑_屋

在编程过程中,我们必定经常用到 +、-、=、(a ? b :c)等操作符号,使用起来相当方便。
但是在一些自定义的 struct 或者 class 中,系统并没有提供相应方法,操作起来就相对复杂。

struct Vector2D {
    var x = 0.0, y = 0.0
}
extension Vector2D {
    func add(_ other: Vector2D) -> Vector2D {
        return Vector2D(x: self.x + other.x, y: self.y + other.y)
    }
}

//然后使用的时候这样调用
let one = Vector2D(x: 1, y: 1)
let two = Vector2D(x: 2, y: 2)
        
let result = one.add(two)
let result = one + two

这时候,我们就需要重载 + 这个操作符了,因为是系统定义过的,所以使用的时候,直接重载就可以了。(然后我们就可以像上面这样调用了)

extension Vector2D {
    static func +(left: Vector2D, right: Vector2D) -> Vector2D {
        return Vector2D(x: left.x + right.x, y: left.y + right.y)
    }
}

extension Vector2D {
    static func -+(left: Vector2D, right: Vector2D) -> Vector2D {
        return Vector2D(x: -(left.x + right.x), y: -(left.y + right.y))
    }
}

你会发现,这样写完之后,Xcode 开始报错 Operator implementation without matching operator declaration 说我们没有声明这个运算符,那么我们声明一下就可以了嘛

infix operator -+ : AdditionPrecedence

这里来解释一下什么的含义

当然,我们也可以自定义优先级

infix operator -+ : VectorPrecedence
precedencegroup VectorPrecedence {
    associativity: none
    higherThan: AdditionPrecedence
    lowerThan: MultiplicationPrecedence
}

系统优先级这里有一张表


优先级

回到标题, 1+1 怎么能等于 3 呢

extension Int {
    static func +(left: Int, right: Int) -> Int {
        return 3
    }
}

注意: 在操作符定义中,千万不能使用正在定义的操作符,会无限递归的!

上一篇 下一篇

猜你喜欢

热点阅读