了解 Swift 中的双打和整数

Understanding the Doubles and Ints in Swift

我以为我对双精度数和整数已经有了很好的理解,直到我不小心 运行 进入了下面的代码。

令我惊讶的是,下面的代码工作得很好。

let amounts = [50, 5.0, 10]
var total = 0.0

for i in 0..<amounts.count {
  total += amounts[i]

  print("Total: \(total)")
}

...但如果我将 5.0 更改为 1050 甚至 5 并生成以下错误,它就会停止工作。

error: binary operator '+=' cannot be applied to operands of type 'Double' and 'Int'

有人能告诉我为什么混合使用 505.010 时代码不会被破坏吗?我的印象是这行不通。

Swift 中的数组可以包含单一类型的元素,因此当您混合使用 50, 5.0, 10 时,编译器将推断 Array 的类型为 Double

在工作代码中,当您将 5.0 更改为 10 时,数组是 [Doubles] 的数组,因为 swift 类型推断,数组是 [Int]

因此

二元运算符“+=”不能应用于 'Double' 和 'Int'

类型的操作数

如您所知,Swift 对类型非常严格,但有一个地方不那么严格 - 文字。 Double 符合 ExpressibleByIntegerLiteral,所以你可以这样做:

let x: Double = 1 // "1" is "magically" converted to a Double!?

并编译。与数组相同 - 编译器认为您拥有的数组文字:

[50, 5.0, 10]

是一个[Double],因为它可以将5010都转换成Double。它不能是 [Int] 因为 5.0 不能转换为 IntInt 不符合 ExpressibleByFloatLiteral

行:

total += amounts[i]

仅在双方为同一类型时有效。请注意,这里编译器不会尝试将 Int 转换为 Double,因为涉及的表达式(totalamounts[i])不是文字!

如果将数组文字更改为 [50, 10, 10],则所有元素都是 Int,因此编译器推断数组为 [Int],而 amount[i] 变为 Int,导致该行编译失败。

Swift 编译器不知道对两种不同数据类型(如 Int 和 Double)的操作。

因此,您可以使用此代码通过从 Int 到 Double 的类型转换来实现此目的。

  let amounts = [50, 5, 10]
var total = 0.0

for i in 0..<amounts.count {
    total = total + Double(amounts[i])

  print("Total: \(total)")
}