了解Swift中的双打和整数

时间:2019-11-14 17:33:05

标签: swift int double

我以为我对Doubles和Ints有很好的了解,直到我不小心遇到以下代码。

让我惊讶的是,以下代码可以正常工作。

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

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

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

...但是如果我将5.0更改为10或将50甚至更改为5,它将停止工作并产生以下错误。

  
    

错误:二进制运算符'+ ='不能应用于类型'Double'和'Int'的操作数

  

有人可以告诉我为什么混合505.010时代码不会中断吗?我觉得这行不通。

3 个答案:

答案 0 :(得分:3)

正如您所知,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]成为{{1 }},导致该行无法编译。

答案 1 :(得分:2)

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

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

因此

二进制运算符'+ ='不能应用于类型'Double'和'Int'的操作数

enter image description here

答案 2 :(得分:1)

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)")
}