Swift 操作符

Swift 支持重载操作符这样的特性。可以直接重载像 +-* 这样的操作符,因为 Swift 中已经有定义了

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

let v1 = Vector2D(x: 2.0, y: 3.0)
let v2 = Vector2D(x: 1.0, y: 4.0)
//Vector2D(x: 3.0, y: 7.0)
let v3 = Vector2D(x: v1.x + v2.x, y: v1.y + v2.y)

重载加号操作符

func +(left: Vector2D, right: Vector2D) -> Vector2D {
    return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
//Vector2D(x: 3.0, y: 7.0)
let v4 = v1 + v2

新加操作符的话,需要先对其进行声明,告诉编译器这个符号其实是一个操作符。

precedencegroup DotProductPrecedence {
    associativity: none
    higherThan: MultiplicationPrecedence
}

infix operator +*: DotProductPrecedence
func +* (left: Vector2D, right: Vector2D) -> Double {
    return left.x * right.x + left.y * right.y
}

//14.0
let v5 = v1 +* v2
  • precedencegroup
    定义了一个操作符优先级别。操作符优先级的定义和类型声明有些相似,一个操作符比需要属于某个特定的优先级。Swift 标准库中已经定义了一些常用的运算优先级组,比如加法优先级 (AdditionPrecedence) 和乘法优先级 (MultiplicationPrecedence) 等,你可以在这里找到完整的列表。如果没有适合你的运算符的优先级组,你就需要像我们在例子中做得这样,自己指定结合律方式和优先级顺序了。

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

  • higherThan
    运算的优先级,点积运算是优先于乘法运算的。除了 higherThan,也支持使用 lowerThan 来指定优先级低于某个其他组。

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

摘录来自: 王巍 (onevcat). “Swifter - Swift 必备 Tips (第四版)。”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容