2015-12-17 13 views
6

Sto provando a creare un CGPath in Swift. Sto usando CGPathCreateWithRect(rect, transformPointer).UnsafePointer <CGAffineTransform> da CGAffineTransform

Come posso ottenere un UnsafePointer<CGAffineTransform> da un CGAffineTransform? Ho provato questo:

let transform : CGAffineTransform = CGAffineTransformIdentity 
    let transformPointer : UnsafePointer<CGAffineTransform> = UnsafePointer(transform) 

Inoltre ho provato questo:

let transform : CGAffineTransform = CGAffineTransformIdentity 
    let transformPointer : UnsafePointer<CGAffineTransform> = &transform 

ma Swift lamenta un '&' with non-inout argument of type.... Ho anche provato a passare &transform direttamente in CGPathCreateWithRect ma questo si interrompe con lo stesso errore.

Quando passo direttamente a transform, Swift "Impossibile convertire il valore di tipo 'CGAffineTransform' nel tipo di argomento previsto 'UnsafePointer'".

Cosa sta succedendo e come è possibile farlo funzionare con Swift 2.1?

risposta

3

@ Martin R fornisce la risposta migliore, ma in alternativa, Mi piace usare i miei puntatori mutabili non sicuri in questo modo, nel caso in cui sia necessario modificare il puntatore reale in futuro

let path = withUnsafeMutablePointer(&transform) 
{ 
    CGPathCreateWithRect(CGRect(...), UnsafeMutablePointer($0)) 
} 
+1

Non è necessario un puntatore * mutable * e non è necessario il cast del puntatore, quindi può essere abbreviato in 'withUnsafePointer (& transform) {CGPathCreateWithRect (CGRect(), $ 0)}'. - Sono abbastanza sicuro che CGPathCreateWithRect() * copia * i dati e non mantiene il puntatore. Altrimenti sarebbe inutilizzabile in C dove è possibile passare l'indirizzo di una matrice (locale) a quella funzione. –

+0

Questo è vero, non ho familiarità al 100% con CGPathCreateWithRect, stavo appena uscendo dalla memoria su come gestisco i puntatori non sicuri in varie situazioni – Knight0fDragon

+1

Perché questa è la risposta? Preferirei usare prima Martin R way, dovrebbe ottenere pieno credito per la risposta, stavo solo indicando un modo diverso per i puntatori mutabili non sicuri nel caso in cui le persone si imbattessero in quel problema – Knight0fDragon

13

I've also tried passing &transform directly into CGPathCreateWithRect ...

Eri quasi arrivato. transform deve essere una variabile per passare come argomento inout con &:

var transform = CGAffineTransformIdentity 
let path = CGPathCreateWithRect(CGRect(...), &transform) 

Per ulteriori informazioni, vedere "Interacting with C APIs" nella documentazione "Uso Swift con cacao e Objective-C".


In Swift 3 questo sarebbe

var transform = CGAffineTransform.identity 
let path = CGPath(rect: rect, transform: &transform) 

o, per l'identità trasformare, solo

let path = CGPath(rect: rect, transform: nil) 
+0

Nell'ultimo Swift/Xcode questo 'var = trasformare CGAffineTransformIdentity ' genera questo errore: CGAffineTransformIdentity non è disponibile a Swift – Confused

+0

Mi dispiace non posso essere di alcun aiuto. Sono confuso da queste cose. Lontano dall'essere ... – Confused

+0

@Confused: vedere l'aggiornamento. –

Problemi correlati