Swift类型推断在扩展中被破坏了吗?

时间:2014-06-10 01:21:30

标签: swift

在调查/试图回答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

请注意,Floattypealias Float32Doubletypealias 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。但似乎有一些警告(或错误?)

1 个答案:

答案 0 :(得分:0)

我认为这里有两件事:

  1. 您无法使用as在数字类型之间进行转换。 (例如0.0 as Intlet f: Float = 0.0; f as Double生成编译器错误。)支持的数字转换方法是使用它们的构造函数:Int(3.14) == 3 // true

  2. 编译器在编译时相对较早地决定(在可能的情况下,在类型推理的帮助下)将文字转化为什么。

    当给出var zero_float2: Double = 0这样的陈述时,它足够聪明地知道它应该将0解释为双倍。

    内部是一个泛型函数,它没有这个上下文来帮助解释。给定语句return 0.0 as? T,编译器将0.0的默认解释作为Double,或0作为Int,并且该类型在泛型方法中是硬编码的,无论T成为什么。