2016-11-26 85 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

相關問題