gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 09:21:20 27 4
gpt4 key购买 nike

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

请记住 FloattypealiasFloat32DoubletypealiasFloat64

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 — 哇?

Array<Float64>().get_zero_float_literal()
Array<Double>().get_zero_float_literal()

我的理解是,如果你使用 Array<Float>你应该能够替代 T无论在哪里Float将会。但似乎有一些警告(或错误?)

最佳答案

我认为这里发生了两件事:

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

  2. 编译器在编译时相对较早地决定(在可能的情况下借助类型推断)将文字转换成什么。

    当给出像 var zero_float2: Double = 0 这样的语句时,它足够聪明,知道它应该将 0 解释为 double。

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

关于Swift 类型推断在扩展中被破坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24131457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com