【问题标题】:Understanding the Doubles and Ints in Swift理解 Swift 中的双精度和整数
【发布时间】:2020-03-10 18:14:26
【问题描述】:

我以为我对 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 更改为1050 甚至更改为5,它将停止工作并生成以下错误。

错误:二元运算符“+=”不能应用于“Double”和“Int”类型的操作数

谁能告诉我为什么在混合505.010 时代码不会中断?我的印象是这行不通。

【问题讨论】:

标签: swift int double


【解决方案1】:

如您所知,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,导致该行编译失败。

【讨论】:

    【解决方案2】:

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

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

    因此

    二元运算符“+=”不能应用于“Double”和“Int”类型的操作数

    【讨论】:

    • 这解释了症状,但不是原因
    • 顺便说一句,您可以使用反引号来突出显示代码 like this,而不是 粗体
    • 感谢反引号提示。我已经更新了答案,
    【解决方案3】:

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

    【讨论】:

    • 我知道如何转换类型,我的问题是为什么它使用混合类型。查看其他答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多