2015-06-06 17 views
16

Ich schreibe eine Funktion in Swift, um zu erkennen, auf welches Sechseck ich klicke. Aber ich stieß auf eine seltsame Fehlermeldung, die besagt, dass ich zwei CGFloats nicht hinzufügen kann. Was auch immer ich gemacht habe, z.B. Ändern let zu var, separat deklarieren und zuweisen, hat nicht funktioniert. Ich denke, da muss etwas anderes falsch sein, aber ich kann es nicht finden. Der Code lautet wie folgt:Swift binärer Operator '+' kann nicht auf zwei CGFloat-Operanden angewendet werden

func pointToCoordinate(position: CGPoint) -> (Int, Int) { 
     var gridHeight = 2 * singleRadius/sqrt(CGFloat(3)) * 1.5 
     var gridWidth = 2 * singleRadius 
     var halfWidth = singleRadius 

     var relativePosition = CGPoint(x: position.x - totalRadius/2, y: position.y - totalRadius/2) 
     println((relativePosition.y/gridHeight)) 
     var row = -(cgfloatToInt)(relativePosition.y/gridHeight) 
     var column: Int 

     println((relativePosition.x + halfWidth * CGFloat(row + 1))/(gridWidth)) 
     column = cgfloatToInt((relativePosition.x + halfWidth * CGFloat(row + 1))/(gridWidth)) 

//  var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row) 
     var innerX = relativePosition.x 
     var innerY = relativePosition.y 

     innerY = innerY - CGFloat(gridHeight * row) 

     println((innerX, innerY)) 
     return (column, row) 
    } 

Error Message

Antwort

52

Die Fehlermeldung ist falsch. Das Problem ist, dass Sie versuchen, Int und CGFloat zu multiplizieren.

ersetzen:

innerY = innerY - CGFloat(gridHeight * row) 

mit:

innerY = innerY - gridHeight * CGFloat(row) 

Die Antwort oben für die aktuelle Version des Codes ist. Für die auf Kommentar-Version, die auf die Fehlermeldung entspricht, die Sie geschrieben:

ersetzen:

var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row) 

mit

var innerY: CGFloat = CGFloat(relativePosition.y) + gridHeight * CGFloat(row) 
+2

"Die Fehlermeldung ist falsch" ist immer noch sehr relevant in Bezug auf die gleiche Nachricht in Xcode 8/Swift 3. –

+0

Danke, es hat für mich funktioniert. :) – Chandni

2

Tatsächlich gibt etwas anderes falsch ist, das funktioniert:

import QuartzCore 

let a:CGFloat = 1 
let b:CGFloat = 2 

let c = a + b 
var innerY: CGFloat = CGFloat(1.0) + CGFloat(2.0) 

und CGFloat implementiert die FloatingPointType Typ

0

Späte beizutreten. Basierend auf der Antwort von vacawama wissen Sie alle, dass das Problem nicht denselben Datentyp hat.
CGFloat muss manchmal mehrmals geschrieben werden. Ich fand das einfacher über die Erweiterung. Also eine Antwort teilen. Sie können eine einfache Erweiterung wie unten erstellen. Natürlich kann diese Erweiterung weiter modifiziert werden.

import CoreGraphics 
extension Int { 
    var cgf: CGFloat { return CGFloat(self) } 
    var f: Float { return Float(self) } 
} 

extension Float { 
    var cgf: CGFloat { return CGFloat(self) } 
} 

extension Double { 
    var cgf: CGFloat { return CGFloat(self) } 
} 

extension CGFloat { 
    var f: Float { return Float(self) } 
} 

Jetzt können wir

innerY = innerY - gridHeight * row.cgf 
1

Blick durch alle Antworten, Gussteile, die Umwandlung und Erweiterungen schreiben, ich denke, die beste Lösung noch zu sagen, für Swift Betreiber Überlastung ist. Codebeispiel unten für Swift 3.0:

/// overloads -/+ between a cgfloat on the left and an int/double on the right 
func - (left: CGFloat, right: Double) -> CGFloat { 
    return left - CGFloat(right); 
} 

func - (left: CGFloat, right: Int) -> CGFloat { 
    return left - CGFloat(right); 
} 

func + (left: CGFloat, right: Double) -> CGFloat { 
    return left + CGFloat(right); 
} 

func + (left: CGFloat, right: Int) -> CGFloat { 
    return left + CGFloat(right); 
} 

dies zu einem globalen Ort Put OUTSIDE jeder Klasse. Siehe Magie tritt auf.