我以为我对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'的操作数
有人可以告诉我为什么混合50
,5.0
和10
时代码不会中断吗?我觉得这行不通。
答案 0 :(得分:3)
正如您所知,Swift对类型非常严格,但是在某些方面它并不那么严格-文字。 Double
符合ExpressibleByIntegerLiteral
,因此您可以这样做:
let x: Double = 1 // "1" is "magically" converted to a Double!?
并进行编译。与数组相同-编译器认为您拥有的数组文字:
[50, 5.0, 10]
是[Double]
,因为它可以将50
和10
都转换为Double
。不能为[Int]
,因为5.0
无法转换为Int
(Int
不符合ExpressibleByFloatLiteral
)
该行:
total += amounts[i]
仅在双方类型相同时有效。请注意,在这里,编译器不会尝试从Int
转换为Double
,因为涉及的表达式(total
和amounts[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'的操作数
答案 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)")
}