使用重写的数学函数

时间:2016-10-18 15:13:27

标签: swift function scope

尝试编译此代码

pow(10,2)
struct Test {
  var i:Int
  func pow(_ p:Int) -> Int { return pow(i,p) }
}
var s = Test(i:10)
s.pow(2)

给了我一个编译器错误。很明显,标准的math.h函数pow被Swift的范围规则所掩盖。由于pow的math.h版本具有不同的签名,因此这类似于编译器错误。有没有办法调用它?

1 个答案:

答案 0 :(得分:3)

有两个问题:第一个是如何解决pow(i,p)。 如Swift 3.0: compiler error when calling global func min<T>(T,T) in Array or Dictionary extension中所述,这是 可以通过在模块名称前加上函数调用来解决。

第二个问题是没有pow功能 两个整数参数。有

public func powf(_: Float, _: Float) -> Float
public func pow(_: Double, _: Double) -> Double

在标准数学库中,

public func pow(_ x: Decimal, _ y: Int) -> Decimal

在Foundation库中。所以你必须选择使用哪一个, 例如:

struct Test {
    var i:Int
    func pow(_ p:Int) -> Int {
        return lrint(Darwin.pow(Double(i),Double(p)))
    }
}

将参数转换为Double并对结果进行舍入 回到Int

或者,使用迭代乘法:

struct Test {
    var i: Int
    func pow(_ p:Int) -> Int {
        return (0..<p).reduce(1) { $0.0 * i }
    }
}

我在https://codereview.stackexchange.com/a/142850/35991观察到了这一点 这对于小指数来说更快。您的里程可能会有所不同。