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?
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)
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.
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:
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 Float
s, pas CGFloat
s, 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 Double
ou 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
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