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 行为在起作用:
- 如果需要,Swift 可以将 int文字推断为类型浮点数(或双精度(
- 每个文本都有一个默认类型,在推理失败时使用。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
型,因为1
和2
都是Int类型。
如果没有指示,Swift 不会尝试推断浮点数。