了解 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
更改为 10
或 50
甚至 5
并生成以下错误,它就会停止工作。
error: binary operator '+=' cannot be applied to operands of type 'Double' and 'Int'
有人能告诉我为什么混合使用 50
、5.0
和 10
时代码不会被破坏吗?我的印象是这行不通。
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]
,因为它可以将50
和10
都转换成Double
。它不能是 [Int]
因为 5.0
不能转换为 Int
(Int
不符合 ExpressibleByFloatLiteral
)
行:
total += amounts[i]
仅在双方为同一类型时有效。请注意,这里编译器不会尝试将 Int
转换为 Double
,因为涉及的表达式(total
和 amounts[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)")
}
我以为我对双精度数和整数已经有了很好的理解,直到我不小心 运行 进入了下面的代码。
令我惊讶的是,下面的代码工作得很好。
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
并生成以下错误,它就会停止工作。
error: binary operator '+=' cannot be applied to operands of type 'Double' and 'Int'
有人能告诉我为什么混合使用 50
、5.0
和 10
时代码不会被破坏吗?我的印象是这行不通。
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]
,因为它可以将50
和10
都转换成Double
。它不能是 [Int]
因为 5.0
不能转换为 Int
(Int
不符合 ExpressibleByFloatLiteral
)
行:
total += amounts[i]
仅在双方为同一类型时有效。请注意,这里编译器不会尝试将 Int
转换为 Double
,因为涉及的表达式(total
和 amounts[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)")
}