it-swarm.com.de

Der binäre Operator '+' kann nicht auf zwei CGFloat-Operanden angewendet werden.

Codierung in Swift und erhalte den obigen Fehler ...

Maskiert die Nachricht etwas anderes OR, können Sie wirklich nicht zwei CGFloat-Operanden hinzufügen? Wenn nicht, warum (auf Erden) nicht?

BEARBEITEN

Der Code, den ich versuche, enthält nichts Besonderes. Interessant ist, dass mir die obige Fehlermeldung VERBATIM von dem Assistenten des Swift-Assistenten (unterstrichener Code mit roten, verschnörkelten Zeilen) mitgeteilt wird.

Xcode 6.3 (Swift 1.2) ausführen

22
Sam

Es ist absolut möglich, zwei CGFloat-Variablen mit dem Binäroperator '+' hinzuzufügen. Was Sie wissen müssen, ist die resultierende Variable auch eine CGFloat-Variable (basierend auf dem Inferenzprinzip des Typs).

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.

BEARBEITEN: Mit 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

Ich bin darauf mit diesem unschuldig aussehenden Code gestoßen:

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)
    //                 ~~~~~~ ^ ~~~~~~~
}

Und fand die Lösung durch Erweitern des Fehlers im Issue Navigator:  Expanding the error, revealing "Expected an argument list of type '(Float, Float)'"

Ich glaube, Swift hat die Funktion +(lhs: Float, rhs: Float) -> Float zuerst anhand ihres Rückgabetyps gefunden (ceilf nimmt eine Float). Offensichtlich erfordert dies Floats und nicht CGFloats, wodurch die Bedeutung der Fehlermeldung beleuchtet wird. Um die Verwendung des richtigen Operators zu erzwingen, müssen Sie eine Wrapper-Funktion verwenden, die entweder eine Doubleoder eine Float (oder natürlich nur eine CGFloat) benötigt. Also habe ich es versucht und der Fehler wurde behoben:

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

Ein anderer Ansatz wäre die Verwendung einer Funktion, die eine Double oder CGFloat verwendet:

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

Das Problem ist also, dass der Compiler setzt Rückgabetypen den Parametertypen vor. Ich bin froh zu sehen, dass dies in Swift 3 noch immer der Fall ist; P

4
Ben Leggiero

Es sind hauptsächlich zwei mögliche Gründe dafür verantwortlich, solche Fehler aufzutreten.

zuerst:

Immer wenn Sie versuchen, die optionale Variable CGFloat zu vergleichen

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

Dies ist für einen Fehler verantwortlich, also machen Sie es einfach als if a! >= b!{}

Zweitens: Wenn Sie direkt Wert verwenden, um zu diesem Zeitpunkt ein Ergebnis zu erhalten, tritt ein solcher Fehler auf

mögen

var result = 1.5 / 1.2

Verwenden Sie nicht wie oben.
Verwendung mit einem Objekt, das als CGFloat deklariert ist

mögen

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