Swift 的 int 文字到浮点推理是如何工作的?



Swift 可以将 int 文字推断为双精度或浮点数

let x: Float = 3

它甚至可以与算术一起使用。它将在进行数学运算之前转换所有内容,因此这也是 3:

let y: Float = 5/2 + 0.5

但是实际的规则是什么?存在模棱两可的情况,例如,如果推理是针对参数的:

func foobar(_ x: Int) -> Int {
return x
}
func foobar(_ x: Float) -> Float {
return y
}
foobar(1/2)

在这种情况下,它将其推断为 int 并返回 0,但如果删除第一个函数,它将切换到浮点数并返回 0.5。

规则是什么?它在哪里记录?

更烦人的是,当 Swift可以推断出它是一个浮点数,但不能

func foobar(_ x: Float) -> Float {
return x
}
let x = 1/2
foobar(x) // Cannot convert value of type 'Int' to expected argument type 'Float'

这里有两个 Swift 行为在起作用:

  1. 如果需要,Swift 可以将 int文字推断为类型浮点数(或双精度(
  2. 每个文本都有一个默认类型,在推理失败时使用。int 文本的类型是Int

只有一个函数,则适用规则 1。它看到需要浮点数,因此它将除法推断为浮点除法,将 int 文字推断为浮点数:

func foobar(_ x: Float) -> Float {
return y
}
foobar(1/2) // 0.5

如果重载函数,规则 1 将不再有效。该类型现在不明确,因此它回退到默认的Int类型,幸运的是与其中一个定义匹配:

func foobar(_ x: Int) -> Int {
return x
}
func foobar(_ x: Float) -> Float {
return y
}
foobar(1/2)  // 0

看看如果您将其设置为默认值不再有效会发生什么。这两个规则都不适用,因此您会收到错误:

func foobar(_ x: Double) -> Double {
return x
}
func foobar(_ x: Float) -> Float {
return y
}
foobar(1/2)  // Ambiguous use of operator '/'

文本没有这样的类型。文档说,

如果没有合适的类型信息可用,Swift 推断 文本的类型是默认文本之一 在 Swift 标准库中定义的类型。默认类型为 Int 对于整数文本,双精度用于浮点文本,字符串用于 字符串文字,布尔值表示布尔文字。

所以除非你的参数显式说Int以外的任何东西,否则它会推断整数文字为Int


有关详细信息,请参阅词汇结构 - 文字。

默认情况下,传入1/2作为参数,您正在对两个整数执行计算,这两个整数的计算结果将为整数类型,因此是使用的第一个函数。

要获得Float,一个或所有参数必须属于Float类型,因此要么1.0/2,要么1/2.0,要么1.0/2.0。这将导致第二个函数改为运行。

let x = 1/2中,x 被推断为Int型,因为12都是Int类型。

如果没有指示,Swift 不会尝试推断浮点数

相关内容

  • 没有找到相关文章

最新更新