2016-11-26 6 views
22

Beim Versuch, diesen Code in Swift 3 auszuführen, bin ich auf den Fehler gestoßen: der binäre Operator '/' kann nicht auf zwei 'doppelte' Operanden angewendet werdenbinärer Operator '/' kann nicht auf zwei 'doppelte' Operanden angewendet werden

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = Double(value)/2.0 
} 

Doch funktioniert das

var array2 = [Double]() 
array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = value/2.0 
} 

Warum nicht der erste Block von Code arbeiten?

Antwort

26

Der Fehler ist ein bisschen irreführend.

Im ersten Satz von Code wird array2 implizit als Array von Int deklariert. Jeder Versuch, einem Index von array2 einen Wert zuzuweisen, erfordert daher einen Wert von Int.

Das Problem ist, dass Double(value)/2.0 zu einem Double Wert führt, nicht ein Int. Daher sucht der Compiler nach einer Version /, die Int zurückgibt. Und diese Version erwartet zwei Int Parameter. Da Sie zwei Double Parameter angeben, erhalten Sie den Fehler in Ihrer Frage erwähnt.

Die Lösung besteht darin, entweder das Ergebnis zu Int zu werfen oder zwei Int Parameter zu / zu verwenden.

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = Int(Double(value)/2.0) // cast to Int 
} 

oder

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = value/2 // Use two Int 
} 

Das Ergebnis wird das gleiche in diesem Fall sein. 8 wird durch 4 ersetzt. 7 mit 3 usw.

Der zweite Satz von Code funktioniert wie sie ist, weil Sie das Array mit Double so alles mit dem richtigen Typ entspricht bis zu befüllenden erklären ersetzt werden.

+0

Große Antwort, danke. –

+1

Liebe die irreführenden Swift Compiler Fehler:/ – shelll

+1

Beachten Sie, dass Int (...) 'ist * nicht * eine Besetzung - Sie können in Swift nicht zwischen verschiedenen numerischen Typen umwandeln. Es ist eine * Umwandlung * durch Verwendung von Int 'Initialisierer. – Hamish

2

Für die ersten, ist das Array daher vom Typ Intarray2.enumerated() tun gibt Ihnen value als Int. Wenn Sie dies tun, Double(value)/2.0, ist das endgültige Ergebnis vom Typ Double, die mit Ihrem Array-Typ nicht kompatibel ist. obwohl

Für die zweite, erklärt Sie explizit eine Reihe von Double daher array2.enumerated() kehrt value als Double so den Betrieb funktioniert gut durchführen.

1

rmaddy's Antwort ist richtig, warum Sie das Problem sehen, die implizite Int-Deklaration. Der Vollständigkeit halber. Es gibt ein paar Möglichkeiten, dies zu beheben, Casting ist eine; ein anderes, das hier noch nicht erwähnt wird, ist das Erweitern von Double, um diesen Fall einzuschließen. Wenn Sie dies genug tun müssen, können Sie einfach Ihre eigene Version von Double/Int definieren und steuern, wie Swift sie in Ihrer eigenen Funktion behandelt.

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

Sie können jederzeit eine andere Funktion fügen Sie den umgekehrten Fall der Handhabung ein Int/Double, etc ...

+0

Etwas Neues! Wie benutzt man das? – Hemang

Verwandte Themen