【问题标题】:How to use ** for exponents using @infix func **( )?如何使用 @infix func **( ) 将 ** 用于指数?
【发布时间】:2014-06-06 14:53:00
【问题描述】:

我想使用** 来重载指数函数。如果我使用“^”之类的东西,我会工作,但 python 的做法是**,我想在 Swift 中使用它。有什么办法吗?

错误:没有匹配运算符声明的运算符实现

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

println(8.0**3.0) // Does not work

【问题讨论】:

  • 您确定^ 可以按预期工作吗?我只是把它作为一个补充:println(1^2) == 3
  • @vol7ron ^ 是按位异或运算符。 1^2 恰好等于 1+2。请参阅The Swift Programming Language,语言指南 -> 高级运算符 -> 位异或运算符。
  • @Lensflare:我说的是 Python,其中^ 不充当指数。我认为我错了并且误读了这个问题,这表明他可以在 Swift 中重载 ^ 以充当插入符号,但他想使用 **,在尝试重载时它不起作用。
  • 你需要使用 Jamie 的回答告诉编译器你想使用什么函数名。

标签: swift operators infix-operator


【解决方案1】:

在定义函数之前需要先声明操作符,如下:

在 Swift 2 中:

import Darwin

infix operator ** {}

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

println(8.0 ** 3.0) // works

在 Swift 3 中:

import Darwin

infix operator **

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

print(8.0 ** 3.0) // works

【讨论】:

  • 从 beta 6 开始,它必须写成infix operator ** {}
  • 感谢@Klaas,我更新了 Xcode 6 beta 6 的答案。
  • Swift3: infix operator **
  • 感谢@GitSyncApp,我也用 Swift 3 代码更新了答案。
【解决方案2】:

为了确保**在相邻的*或/之前执行,你最好设置一个优先级。

infix operator ** { associativity left precedence 160 }

正如http://nshipster.com/swift-operators/ 所示,指数运算符有 160 个优先级,就像 > 位移运算符一样。

【讨论】:

    猜你喜欢
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2020-01-12
    相关资源
    最近更新 更多