J'écris une fonction dans Swift pour détecter l'hexagone sur lequel je clique. Mais je suis tombé sur un message d'erreur particulier indiquant que je ne peux pas ajouter deux CGFloats. Quoi que je fasse, par exemple changer let
en var
, déclarer et assigner séparément, n'a pas fonctionné. Je suppose qu'il doit y avoir quelque chose d'autre qui ne va pas, mais je ne le trouve pas. Le code est comme suit:
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)
}
Le message d'erreur est faux. Le problème est que vous essayez de multiplier une Int
et une CGFloat
.
Remplacer:
innerY = innerY - CGFloat(gridHeight * row)
avec:
innerY = innerY - gridHeight * CGFloat(row)
La réponse ci-dessus concerne la version actuelle de votre code. Pour la version commentée qui correspond au message d'erreur que vous avez posté:
Remplacer:
var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row)
avec
var innerY: CGFloat = CGFloat(relativePosition.y) + gridHeight * CGFloat(row)
En examinant toutes les réponses, les castings, les conversions et les extensions, je pense que la meilleure solution pour le moment à dire pour Swift est Overload Overload . Exemple de code ci-dessous pour 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);
}
Mettez ceci dans un endroit globalEXTÉRIEURde n'importe quelle classe. Voir la magie se produit.
En effet, il y a quelque chose d'autre qui ne va pas, cela fonctionne:
import QuartzCore
let a:CGFloat = 1
let b:CGFloat = 2
let c = a + b
var innerY: CGFloat = CGFloat(1.0) + CGFloat(2.0)
et CGFloat
implémente le type FloatingPointType
En retard pour rejoindre. D'après la réponse de vacawama, vous savez tous que le problème est de ne pas avoir le même type de données.CGFloat
doit parfois être écrit plusieurs fois. J'ai trouvé cela plus facile par extension. Donc, partager une réponse. Vous pouvez créer une extension simple comme ci-dessous. Bien sûr, cette extension peut être encore modifiée.
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) }
}
Maintenant nous pouvons écrire
innerY = innerY - gridHeight * row.cgf