在Swift 3中尝试执行此代码块时,我遇到了错误:二元运算符' /'不能适用于两个' Double'操作数
var array2 = [8, 7, 19, 20]
for (index, value) in array2.enumerated() {
array2[index] = Double(value) / 2.0
}
然而这是有效的
var array2 = [Double]()
array2 = [8, 7, 19, 20]
for (index, value) in array2.enumerated() {
array2[index] = value / 2.0
}
为什么第一个代码块没有工作?
答案 0 :(得分:26)
错误有点误导。
在第一组代码中,array2
被隐式声明为Int
的数组。因此,任何将值分配给array2
索引的尝试都需要Int
值。
问题是Double(value) / 2.0
会产生Double
值,而不是Int
。因此,编译器正在寻找返回/
的{{1}}版本。该版本需要两个Int
个参数。由于您提供了两个Int
参数,因此您会收到问题中提到的错误。
解决方案是将结果投射到Double
或使用两个Int
参数投放到Int
。
/
或
var array2 = [8, 7, 19, 20]
for (index, value) in array2.enumerated() {
array2[index] = Int(Double(value) / 2.0) // cast to Int
}
在这种情况下,结果将是相同的。 var array2 = [8, 7, 19, 20]
for (index, value) in array2.enumerated() {
array2[index] = value / 2 // Use two Int
}
将替换为8
。 4
将替换为7
等。
第二组代码按原样运行,因为您声明要使用3
填充数组,因此所有内容都与正确的类型匹配。
答案 1 :(得分:2)
对于第一个数组,您的数组类型为Double
,因此Int
会将array2.enumerated()
作为value
。对Int
执行此操作时,返回的最终结果类型为Double(value) / 2.0
,与您的数组类型不兼容。
对于第二个,你明确声明了一个Double
数组,因此Double
返回array2.enumerated()
作为value
,所以执行该操作就可以了。
答案 2 :(得分:1)
extension Double {
static func / (left: Double, right: Int) -> Double {
return left / Double(right)
}
}
你总是可以添加另一个处理Int / Double等反向情况的函数......