【发布时间】:2020-09-22 12:22:44
【问题描述】:
此 Swift 5 代码将通过将 dbl 的返回类型与接收返回值的变量的类型相匹配来选择调用哪个版本的 dbl:
func dbl(_ x: Int) -> Int {
print("called Intdbl")
return Int(x * 2)
}
func dbl(_ x: Int) -> Float {
print("called Floatdbl")
return Float(x * 2)
}
var intsum : Int = 0
var floatsum : Float = 0
intsum = dbl(2) // prints "called Intdbl" and assigns Int(4)
floatsum = dbl(2) // prints "called Floatdbl" and assigns Float(4)
如果我想将其转换为通用函数怎么办?我想应该是这样的:
func dbl<T>(_ x: Int) -> T {
return T(x * 2)
}
var intsum : Int = 0
var floatsum : Float = 0
intsum = dbl(2)
floatsum = dbl(2)
但这失败并出现错误:
Non-nominal type 'T' does not support explicit initialization.
还有这个:
func dbl<T>(_ x: Int) -> T {
return T.init(x * 2)
}
var intsum : Int = 0
var floatsum : Float = 0
intsum = dbl(2)
floatsum = dbl(2)
失败并出现错误Type 'T' has no member 'init'
一般来说,如果不是T 或T.init,您如何使用泛型类型(如T)来创建新值?
FWIW 我认为这适用于 T 表示具有显式 init 的类或结构的特殊情况。但是泛型也应该适用于内置类型(IIUC)
【问题讨论】: