尝试编译此代码
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版本具有不同的签名,因此这类似于编译器错误。有没有办法调用它?
答案 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观察到了这一点 这对于小指数来说更快。您的里程可能会有所不同。