2015-02-23 20 views
21

Codifica in Swift e ottieni l'errore sopra ...L'operatore binario "+" non può essere applicato a due operandi CGFloat?

Il messaggio nasconde qualcos'altro O non puoi davvero aggiungere due operandi CGFloat? Se no, perché (sulla terra) no?

EDIT

Non c'è niente di speciale nel codice che sto cercando di fare; ciò che è interessante è che il messaggio di errore sopra, VERBATIM, è quello che mi dice il compilatore dell'assistente Swift (sottolineando il mio codice con linee ondulate rosse).

Esecuzione di Xcode 6.3 (Swift 1.2)

+2

Certo che puoi. - Un esempio di codice (piccolo, autonomo) che mostri il tuo problema sarebbe estremamente utile ... –

+0

Anche io ricevo lo stesso errore, quale potrebbe essere la possibile ragione? – sasquatch

risposta

23

E 'assolutamente possibile, l'aggiunta di due variabili CGFloat utilizzando l'operatore binario '+'. Quello che devi sapere è che la variabile risultante è anche una variabile CGFloat (basata sul tipo Principio di inferenza).

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: da Swift convenzione 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. 
+0

Grazie. Hai appena confermato che non sto impazzendo. – Sam

+9

Apple ha bisogno di creare 'CGFloat' e la struttura' Float' di swift (e speriamo anche 'NSInteger' e' Int', ecc.) Si adattano bene l'uno con l'altro, o creano una libreria geometrica nuova di zecca basata sui tipi nativi di swift. Fino ad allora, il passaggio a Swift è un vero PITA. –

4

mi sono imbattuto in questo utilizzando questo pezzo innocente di codice:

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

E trovato la soluzione espandendo la errore nel Navigatore problema: Expanding the error, revealing "Expected an argument list of type '(Float, Float)'"

Guardandoci sopra, penso che Swift abbia trovato la funzione +(lhs: Float, rhs: Float) -> Float innanzitutto in base al suo tipo di ritorno (ceilf occupa un Float). Ovviamente, questo prende Float s, non CGFloat s, che fa luce sul significato del messaggio di errore. Così, per costringerlo a utilizzare l'operatore giusto, devi utilizzare una funzione wrapper che prende sia un Doubleo un Float (o solo un CGFloat, ovviamente). Così ho provato questo e l'errore è stato risolto:

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

altro approccio sarebbe quella di utilizzare una funzione che prende un Double o CGFloat:

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

Quindi il problema è che le priorità compilatore restituisce tipi su tipi di parametri. Felice di vedere questo sta ancora accadendo in Swift 3; P

+1

Mi sono imbattuto in qualcosa di simile. L'uso di vecchi metodi matematici con una 'f' finale lo ha fatto. Ad esempio, se esegui 'round' invece di' roundf', questo andrà via. –

+1

Sì, succede ancora in Swift 3. Livello messaggio di errore: Amateur. –

Problemi correlati