在调查/试图回答mythz的问题时," How can we create a generic Array Extension that sums Number types in Swift?"我搁浅了一些非常奇怪的行为。
这是一个错误吗?还是我疯了?
将0
转换为float的工作示例:(两者都导致0.0
)
var zero_float1: Float = 0
var zero_float2: Double = 0
请注意,Float
是typealias
Float32
而Double
是typealias
Float64
extension Array {
func get_zero() -> T? {
return 0 as? T
}
}
返回0
Array<Int>().get_zero()
但这些会返回nil
Array<Float>().get_zero()
Array<Double>().get_zero()
...好奇怪,也许是因为它是文字的int
......?让我们尝试别的东西
extension Array {
func get_zero_float_literal() -> T? {
return 0.0 as? T
}
}
以下返回nil
:
Array<Float>().get_zero_float_literal()
Array<Int>().get_zero_float_literal()
Array<Float32>().get_zero_float_literal()
但这些回归0.0
- whaaa?
Array<Float64>().get_zero_float_literal()
Array<Double>().get_zero_float_literal()
我的理解是,如果您使用Array<Float>
,那么您应该能够在T
的任何地方替换Float
。但似乎有一些警告(或错误?)
答案 0 :(得分:0)
我认为这里有两件事:
您无法使用as
在数字类型之间进行转换。 (例如0.0 as Int
和let f: Float = 0.0; f as Double
生成编译器错误。)支持的数字转换方法是使用它们的构造函数:Int(3.14) == 3 // true
编译器在编译时相对较早地决定(在可能的情况下,在类型推理的帮助下)将文字转化为什么。
当给出var zero_float2: Double = 0
这样的陈述时,它足够聪明地知道它应该将0
解释为双倍。
但在内部是一个泛型函数,它没有这个上下文来帮助解释。给定语句return 0.0 as? T
,编译器将0.0
的默认解释作为Double,或0
作为Int,并且该类型在泛型方法中是硬编码的,无论T
成为什么。