为什么会抱怨这个?
因为战俘回归Double
. And Double
不等于T
。该错误消息具有误导性,但它的意思是“找不到pow
接受(Double, Double)
并返回T
type"
我认为你误解了 Swift 中的“cast”。在斯威夫特as
不转换数字类型。
let intVal:Int = 12
let doubleVal:Double = intVal as Double
// ^ [!] error: 'Int' is not convertible to 'Double'
如果操作数的类型在编译时不可预测,则无效转换会导致运行时错误:
func foo<T: IntegerLiteralConvertible>(x: T) {
x as Double // <-- Execution was interrupted
}
foo(12 as Int)
相反,我们必须明确地“转换”它们。参见文档:数值类型转换 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID324
let intVal:Int = 12
let doubleVal:Double = Double(intVal)
这之所以有效只是因为Double
has init(_ v: Int)
初始化程序。以下代码无法编译:
func foo<T: IntegerLiteralConvertible>(x: T) {
Double(x)
// ^~~~~~~~~ [!] error: cannot invoke 'init' with an argument of type 'T'
}
Because Double
不具有init<T:IntegerLiteralConvertible>(_ val:T)
初始化程序。
所以,如果你想使用pow()
,你必须转换T
to Double
对于参数,并转换Double
to T
用于返回值。对此没有简单的解决方案。