美文网首页
Swift 操作符

Swift 操作符

作者: TomatosX | 来源:发表于2017-07-19 10:35 被阅读237次

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)

相加两个向量:

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)
}

这样,我们相加两个向量就简单的多了

let v3 = v1 + v2
print(v3) // 输出 Vector2D(x: 3.0, y: 7.0)

向量的内积运算符API中是没有定义的,所以我们自定义一个内积运算符。
这里是Swift 3的实现方式(感觉看起来比之前的版本可读性好多了)。

// 自定义操作符 别名类型
infix operator +*: InnerProductPrecedence
// 自定义操作符的运算优先级
precedencegroup InnerProductPrecedence {
//    结合律:内积的结果是一个 Double,不再会和其他内积结合使用,所以这里写成 none
    associativity: none
//    优先级设置:高于普通运算。
//    MultiplicationPrecedence(代表乘法和除法)
//    AdditionPrecedence(代表加法和减法)
    higherThan: MultiplicationPrecedence, AdditionPrecedence
}

接下来我们就可以写具体的运算实现了

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

let result = v1 +* v2 // 14

precedencegroup

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

infix

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

associativity

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

higherThan

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

相关文章

  • Swift 操作符

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

  • iOS学习周报三

    在Swift中用??操作符替代判空 在C#中也是有??操作符的,用法和Swift类似用法如下: 相当于 开源项目 ...

  • Currying Operator

    柯里化 操作符 可以直接重载+ - 乘操作符,在swift中有了这些操作符的定义,如果想自定义操作符,比如点乘+*...

  • Swift 十二讲 第九讲 操作符重载和泛型

    1. 操作符重载 Swift允许对操作符进行重载,也允许自己定义操作符。这个功能非常强大也很实用。操作符重载有两种...

  • Swift教程之基本操作符

    基本操作符 本章介绍Swift中的常见操作符,并介绍使用自定义操作符实现复杂运算。 术语 操作符包括一元、二元和三...

  • 范围操作符 单边范围操作符

    在Swift编程语言中引入了范围操作符这种非常方便实用的操作符。范围操作符可用于 for-in 循环迭代、获取一个...

  • Language Guide --- Type Casting

    swift中的类型转换使用is 和 as 操作符。 Checking Type 使用is操作符判断一个实例是否是特...

  • Swift 模式匹配

    在 Swift 中,使用 ~= 来表示模式匹配的操作符。如果我们看看 API 的话,可以看到这个操作符有下面几种版...

  • RxJS系列教程(九) 操作异步流

    Rx,不管你是JS,Java,Python还是Swift,玩的就是操作符。每个操作符怎么用,官方文档写得不能再清楚...

  • 2.11 Swift 3 理解Range和Collection的

    在之前Swift操作符的内容里,我们曾经提到了两个和范围有关的的操作符: Countable range 实际上,...

网友评论

      本文标题:Swift 操作符

      本文链接:https://www.haomeiwen.com/subject/ugtlkxtx.html