web-dev-qa-db-fra.com

L'opérateur binaire Swift '+' ne peut pas être appliqué à deux opérandes CGFloat

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

Error Message

17
Colliot

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)
54
vacawama

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.

4
Michael Shang

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

2
Chris Conover

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
0
san