操作符

Posted by Genie on June 10, 2020

Swift 支持重载操作符这样的特性,所以我们可以设计自己的运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
precedencegroup MyPrecedence {
    // higherThan: AdditionPrecedence   // 优先级,比加法运算高
    lowerThan: MultiplicationPrecedence // 优先级, 比乘法运算低
    associativity: none // 结合方向:left, right or none
    assignment: false // true=赋值运算符,false=非赋值运算符
}

infix operator +*: MyPrecedence

struct Vector2D {
    var x = 0.0
    var y = 0.0
}

let v1 = Vector2D(x: 1, y: 2)
let v2 = Vector2D(x: 3, y: 4)

func +* (lht: Vector2D, rht: Vector2D) -> Vector2D {
    return Vector2D(x: lht.x * rht.x, y: lht.y * rht.y)
}

v1 +* v2 // x: 3 y: 8

infix

表示要定义的是一个中位操作符,即前后都是输入;其他的修饰子还包括 prefix 和 postfix,不再赘述;

associativity

定义了结合律,即如果多个同类的操作符顺序出现的计算顺序。比如常见的加法和减法都是 left,就是说多个加法同时出现时按照从左往右的顺序计算 (因为加法满足交换律,所以这个顺序无所谓,但是减法的话计算顺序就很重要了)。点乘的结果是一个 Double,不再会和其他点乘结合使用,所以这里写成 none