2015-06-06 11 views
16

Sto scrivendo una funzione in Swift per rilevare l'esagono su cui sto facendo clic. Ma mi sono imbattuto in un particolare messaggio di errore che dichiarava che non posso aggiungere due CGFloats. Qualunque cosa abbia fatto, ad es. cambiare let a var, dichiarare e assegnare separatamente, non ha funzionato. Immagino ci debba essere qualcos'altro che non va, ma non riesco a trovarlo. Il codice è il seguente:L'operatore binario Swift '+' non può essere applicato a due operandi CGFloat

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

risposta

52

Il messaggio di errore è sbagliato. Il problema è che stai cercando di moltiplicare uno Int e uno CGFloat.

Sostituire:

innerY = innerY - CGFloat(gridHeight * row) 

con:

innerY = innerY - gridHeight * CGFloat(row) 

La risposta di cui sopra è per la versione corrente del codice. Per la versione commentata che corrisponde al messaggio di errore che hai postato:

Sostituire:

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

con

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

"Il messaggio di errore è sbagliato" è ancora molto rilevante per quanto riguarda questo stesso messaggio in Xcode 8/Swift 3. –

+0

Grazie ha funzionato per me. :) – Chandni

2

In effetti, c'è qualcosa che non va, questo funziona:

import QuartzCore 

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

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

e CGFloat implementa il tipo FloatingPointType

0

tardi per unirsi. Sulla base della risposta di vacawama, tutti voi sapete che il problema non sta avendo lo stesso tipo di dati.
CGFloat deve essere scritto più volte a volte. Ho trovato questo più facile tramite l'estensione. Quindi condividendo una risposta. È possibile creare un'estensione semplice come di seguito. Ofcourse, questa estensione può essere ulteriormente modificata.

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) } 
} 

Ora possiamo scrivere

innerY = innerY - gridHeight * row.cgf 
1

Guardando attraverso tutte le risposte, fusioni, la conversione e le estensioni, credo che la soluzione migliore ancora da dire per la Swift è sovraccarico Operatore. Esempio di codice di seguito per 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); 
} 

mettere questo in un luogo globale FUORI di qualsiasi classe. Vedi la magia si verifica.