二元运算符'/'不能应用于两个'Double'操作数
在试图在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
}
为什么不编码工作的第一块?
该错误有点令人误解。
在第一组代码中,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
将被替换为4
。 7
将3
更换等
第二组的代码工作,是因为你声明数组来填充Double
所以一切都正确类型相匹配。
对于第一个,你的数组是Int
因此做array2.enumerated()
给你value
作为Int
。当你这样做时,Double(value)/2.0
,返回的最终结果是类型Double
,它与您的数组类型不兼容。
对于第二个虽然,你明确声明的Double
因此array2.enumerated()
返回value
为Double
所以执行操作只是正常的数组。
rmaddy的回答是正确的,为什么你看到问题,隐式的Int声明。为了完整性。有几个方法可以解决这个问题,铸造就是一个;另一个这里没有提到的是扩展Double来包含这种情况,如果你需要做到这一点,你可以简单地定义你自己的Double/Int版本,并控制Swift在你自己的函数中如何处理它。
extension Double {
static func/(left: Double, right: Int) -> Double {
return left/Double(right)
}
}
您可以随时添加其他功能处理相反的情况下一个Int /双,等...
新东西!如何使用这个? – Hemang
大回答,谢谢。 –
爱错误的Swift编译器错误:/ – shelll
请注意'Int(...)'是*不是*转换 - 你不能在Swift中的不同数值类型之间进行转换。这是一个*转换*通过使用'Int'的初始化。 – Hamish