2016-11-26 158 views
22

在试图在Swift 3中执行这段代码时,我遇到了错误:二元运算符'/'不能应用于两个'Double'操作数二元运算符'/'不能应用于两个'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 
} 

为什么不编码工作的第一块?

回答

26

该错误有点令人误解。

在第一组代码中,array2被隐式声明为Int的数组。因此,任何尝试将值分配给索引array2将需要一个Int值。

问题是Double(value)/2.0导致Double值,而不是Int。因此,编译器正在查找返回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将被替换为473更换等

第二组的代码工作,是因为你声明数组来填充Double所以一切都正确类型相匹配。

+0

大回答,谢谢。 –

+1

爱错误的Swift编译器错误:/ – shelll

+1

请注意'Int(...)'是*不是*转换 - 你不能在Swift中的不同数值类型之间进行转换。这是一个*转换*通过使用'Int'的初始化。 – Hamish

2

对于第一个,你的数组是Int因此做array2.enumerated()给你value作为Int。当你这样做时,Double(value)/2.0,返回的最终结果是类型Double,它与您的数组类型不兼容。

对于第二个虽然,你明确声明的Double因此array2.enumerated()返回valueDouble所以执行操作只是正常的数组。

1

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

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

您可以随时添加其他功能处理相反的情况下一个Int /双,等...

+0

新东西!如何使用这个? – Hemang

相关问题