web-dev-qa-db-fra.com

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

Coder dans Swift et obtenir l'erreur ci-dessus ...

Le message masquant quelque chose d'autre OR ne peut-il vraiment pas ajouter deux opérandes CGFloat? Si non, pourquoi (sur la terre) pas?

MODIFIER

Il n'y a rien de spécial dans le code que j'essaie de faire; Ce qui est intéressant, c'est que le message d'erreur ci-dessus, VERBATIM, est ce que me dit l'assistant du compilateur Swift (soulignant mon code avec des lignes ondulées rouges).

Lancer Xcode 6.3 (Swift 1.2)

22
Sam

Il est tout à fait possible d'ajouter deux variables CGFloat à l'aide de l'opérateur binaire '+'. Ce que vous devez savoir, c'est que la variable résultante est également une variable CGFloat (basée sur le type Inference Principle).

let value1 : CGFloat = 12.0
let value2 : CGFloat = 13.0
let value3   = value1 + value2
println("value3 \(value3)")

//The result is value3 25.0, and the value3 is of type CGFloat.

EDIT: Selon la convention Swift v3.0

let value = CGFloat(12.0) + CGFloat(13.0)
println("value \(value)")

//The result is value 25.0, and the value is of type CGFloat.
24
Suresh Kumar Durairaj

Je me suis heurté à cela en utilisant ce morceau de code à l'air innocent:

func foo(line: CTLine) {
    let ascent: CGFloat
    let descent: CGFloat
    let leading: CGFloat
    let fWidth = Float(CTLineGetTypographicBounds(line, &ascent, &descent, &leading))
    let height = ceilf(ascent + descent)
    //                 ~~~~~~ ^ ~~~~~~~
}

Et trouvé la solution en développant l'erreur dans le navigateur de problèmes:  Expanding the error, revealing "Expected an argument list of type '(Float, Float)'"

En examinant cela, je pense que Swift a trouvé la fonction +(lhs: Float, rhs: Float) -> Float d’abord sur la base de son type de retour (ceilf prend une Float). De toute évidence, cela prend Floats, pas CGFloats, ce qui éclaire un peu la signification du message d'erreur. Donc, pour le forcer à utiliser le bon opérateur, vous devez utiliser une fonction wrapper qui prend soit une Doubleou une Float (ou simplement une CGFloat, évidemment). Alors j'ai essayé ceci et l'erreur a été résolue:

    // ...
    let height = ceilf(Float(ascent + descent))
    // ...

Une autre approche consisterait à utiliser une fonction prenant Double ou CGFloat:

    // ...
    let height = ceil(ascent + descent)
    // ...

Donc, le problème est que le compilateur donne la priorité aux types de retour par rapport aux types de paramètres. Je suis heureux de voir que cela se produit encore dans Swift 3; P

4
Ben Leggiero

Deux raisons possibles sont principalement responsables de ce type d'erreur.

premier:

Chaque fois que vous essayez de comparer le type optionnel CGFloat variablelike

if a? >= b?
   {
     videoSize = size;
   }

C’est responsable d’une erreur alors faites-le en tant que if a! >= b!{}

Seconde: Chaque fois que vous utilisez la valeur pour obtenir un résultat à ce moment, ce genre d'erreur se produit

comme

var result = 1.5 / 1.2

Ne pas utiliser comme ci-dessus .
utiliser avec un objet qui est déclaré en tant que CGFloat

comme

var a : CGFloat = 1.5
var b : CGFloat = 1.2
var result : CGFloat!
result = a / b
0
Rakesh Patel