二元运算符' /'不能适用于两个' Double'操作数

时间:2016-11-26 00:22:54

标签: swift

在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
}

为什么第一个代码块没有工作?

3 个答案:

答案 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 } 将替换为84将替换为7等。

第二组代码按原样运行,因为您声明要使用3填充数组,因此所有内容都与正确的类型匹配。

答案 1 :(得分:2)

对于第一个数组,您的数组类型为Double,因此Int会将array2.enumerated()作为value。对Int执行此操作时,返回的最终结果类型为Double(value) / 2.0,与您的数组类型不兼容。

对于第二个,你明确声明了一个Double数组,因此Double返回array2.enumerated()作为value,所以执行该操作就可以了。

答案 2 :(得分:1)

rmaddy的答案是正确的,为什么你看到这个问题,隐含的Int声明。为了完整起见。有几种方法可以解决这个问题,铸造就是其中之一;另一个尚未提及的是扩展Double以包含这种情况,如果你需要这么做,你可以简单地定义你自己的Double / Int版本并控制Swift如何在你自己的函数中处理它。

extension Double {
    static func / (left: Double, right: Int) -> Double {
        return left / Double(right)
    }
}

你总是可以添加另一个处理Int / Double等反向情况的函数......