自定义运算符

Swift 支持创建自定义运算符。使用 operator 关键字在全局级别声明新运算符。

运算符的结构由三部分定义:操作数放置,优先级和关联性。

  1. prefixinfixpostfix 修饰符用于启动自定义操作符声明。prefixpostfix 修饰符声明运算符是否必须分别位于其作用的值之前或之后。这样的运算符就像 83++ **一样 ,因为它们只能作用于一个目标。infix 声明了一个二元运算符,它作用于它之间的两个值,例如 2+3

  2. 首先计算优先级较高的运算符。默认的运算符优先级仅高于 ?:(Swift 2.x 中的值为 100)。可以在此处找到标准 Swift 运算符的优先级。

  3. 关联性定义了相同优先级的运算符之间的运算顺序。左关联运算符从左到右计算(读取顺序与大多数运算符一样),而右关联运算符从右到左计算。

Version >= 3.0

从 Swift 3.0 开始,可以在优先级组中定义优先级和关联性而不是运算符本身,这样多个运算符可以轻松地共享相同的优先级而无需引用神秘数字。标准优先级组列表如下所示

运算符根据计算代码返回值。此代码用作普通函数,其中参数指定输入的类型,return 关键字指定运算符返回的计算值。

这是一个简单指数运算符的定义,因为标准 Swift 没有指数运算符。

import Foundation    

infix operator ** { associativity left precedence 170 }

func ** (num: Double, power: Double) -> Double{
    return pow(num, power)
}

infix**算子在两个值之间工作,例如 9**2。因为该函数具有左关联性,所以 3**3**2 计算为 (3**3)**2170 的优先级高于所有标准的 Swift 操作,这意味着 3+2**4 计算到 19,尽管**的左关联性。

Version >= 3.0

import Foundation 

infix operator **: BitwiseShiftPrecedence

func ** (num: Double, power: Double) -> Double {
    return pow(num, power)
}

在 Swift 3.0 上,我们可以使用内置的优先级组 BitwiseShiftPrecedence 来提供正确的值(与 <<>> 相同),而不是显式地指定优先级和关联性。

**:不推荐使用递增和递减,将在 Swift 3 中删除。