2015-12-17 13 views
6

Próbuję utworzyć ścieżkę CGPath w Swift. Używam CGPathCreateWithRect(rect, transformPointer).UnsafePointer <CGAffineTransform> z CGAffineTransform

Jak uzyskać UnsafePointer<CGAffineTransform> od CGAffineTransform? Próbowałem to:

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

Próbowałem też tak:

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

ale Swift narzeka na '&' with non-inout argument of type.... Próbowałem również przekazać &transform bezpośrednio do CGPathCreateWithRect, ale zatrzymuje się z tym samym błędem.

Kiedy przechodzę bezpośrednio pod transform, Swift "Nie można przekonwertować wartości typu" CGAffineTransform "na oczekiwany typ argumentu" UnsafePointer "".

Co się dzieje i jak można to usprawnić za pomocą Swift 2.1?

Odpowiedz

3

@Martin R zapewnia najlepszą odpowiedź, ale jako alternatywa, Lubię korzystać z moich niebezpiecznych wskaźników zmiennokształtnych w ten sposób, w razie potrzeby zmiany rzeczywistego wskaźnika w przyszłości

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

Nie potrzebujesz * zmiennego * wskaźnika i nie potrzebujesz rzucania wskaźnika, więc można go skrócić do 'withUnsafePointer (& transform) {CGPathCreateWithRect (CGRect(), 0 $)}'. - Jestem dość pewny, że CGPathCreateWithRect() * kopiuje * dane i nie utrzymuje wskaźnika. W przeciwnym razie byłaby niezdatna do użytku w C, gdzie możesz przekazać adres tablicy (lokalnej) do tej funkcji. –

+0

To prawda, nie jestem w 100% zaznajomiony z CGPathCreateWithRect, właśnie wychodziłem z pamięci o tym, jak radzę sobie z niebezpiecznymi wskaźnikami w różnych sytuacjach. – Knight0fDragon

+1

Dlaczego to jest odpowiedź? Wolałbym najpierw użyć drogi Martin'a R, powinien dostać pełny kredyt za odpowiedź, po prostu wskazałem inny sposób na niebezpieczne, zmienne wskaźniki na wypadek, gdyby ludzie natknęli się na ten problem – Knight0fDragon

13

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

Byłeś prawie na miejscu. transform musi być zmienna w celu przekazania go jako argumentu InOut z &:

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

Aby uzyskać więcej informacji, zobacz "Interacting with C APIs" w dokumentacji „Korzystanie Swift z kakao i Objective-C”.


W Swift 3 byłoby to

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

lub dla przekształcać tożsamość, podobnie

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

W najnowszym kodzie Swift/X, 'var transform = CGAffineTransformIdentity ' generuje ten błąd: CGAffineTransformIdentity jest niedostępne w Swift – Confused

+0

Niestety nie mogę pomóc. Jestem zdumiony tymi rzeczami. O wiele więcej niż bycie ... – Confused

+0

@Confused: Zobacz aktualizację. –

Powiązane problemy