Swift可以将int文字推断为double或float
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,但是如果删除第一个函数,它将切换为float并返回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'
答案 0 :(得分:1)
文学没有这样的类型。文档说,
如果没有合适的类型信息,Swift会推断出 文字的类型是默认文字之一 Swift标准库中定义的类型。默认类型为Int 整数表示整数,双精度表示浮点整数,字符串表示 字符串文字,布尔为布尔文字。
因此,除非您的论点明确指出除Int
以外的其他内容,否则它将推断整数文字为Int
。
有关更多信息,请参见Lexical Structure - Literals。
答案 1 :(得分:1)
这里有两种Swift行为:
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 '/'
答案 2 :(得分:0)
默认情况下,您传入1/2
作为参数,是对两个 Integers 执行计算,结果将计算为 Integer 类型的结果。使用的第一个功能。
要拥有 Float ,一个或所有参数必须为Float
类型,因此1.0/2
或1/2.0
或1.0/2.0
。这将导致第二个功能运行。
在let x = 1/2
中,将x推断为Int
类型,因为1
和2
都属于 Int 类型。
Swift不会尝试推断 Float 。