Swift的int文字如何进行浮点推理?

时间:2018-09-18 18:09:50

标签: swift type-inference implicit-conversion

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'

3 个答案:

答案 0 :(得分:1)

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

  

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

因此,除非您的论点明确指出除Int以外的其他内容,否则它将推断整数文字为Int


有关更多信息,请参见Lexical Structure - Literals

答案 1 :(得分:1)

这里有两种Swift行为:

  1. 如果需要(或加倍),Swift可以将int literal 推断为 type float
  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 '/'

答案 2 :(得分:0)

默认情况下,您传入1/2作为参数,是对两个 Integers 执行计算,结果将计算为 Integer 类型的结果。使用的第一个功能。

要拥有 Float ,一个或所有参数必须为Float类型,因此1.0/21/2.01.0/2.0 。这将导致第二个功能运行。

let x = 1/2中,将x推断为Int类型,因为12都属于 Int 类型。

如果没有指明,

Swift不会尝试推断 Float