自定义运算符
Swift 支持创建自定义运算符。使用 operator
关键字在全局级别声明新运算符。
运算符的结构由三部分定义:操作数放置,优先级和关联性。
-
prefix
,infix
和postfix
修饰符用于启动自定义操作符声明。prefix
和postfix
修饰符声明运算符是否必须分别位于其作用的值之前或之后。这样的运算符就像8
和3++
**一样 ,因为它们只能作用于一个目标。infix
声明了一个二元运算符,它作用于它之间的两个值,例如2+3
。 -
首先计算优先级较高的运算符。默认的运算符优先级仅高于
?
…:
(Swift 2.x 中的值为 100)。可以在此处找到标准 Swift 运算符的优先级。 -
关联性定义了相同优先级的运算符之间的运算顺序。左关联运算符从左到右计算(读取顺序与大多数运算符一样),而右关联运算符从右到左计算。
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)**2
。170
的优先级高于所有标准的 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 中删除。