Как правильно инициализировать UnsafePointer в Swift?
Я пытаюсь использовать CTFontCreatePathForGlyph(font: CTFont?, glyph: CGGlyph, transform: CConstPointer<CGAffineTransform>)
:
let myFont = CTFontCreateWithName("Helvetica", 12, nil)
let myGlyph = CTFontGetGlyphWithName(myFont, "a")
let myTransform = CGAffineTransformIdentity
Но как правильно передать myTransform
в CTFontCreatePathForGlyph
?
Я попытался создать myTransformPointer
для перехода к такой функции:
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer().initialize(newvalue: myTransform)
но я получаю эту ошибку:
Playground execution failed: error: <REPL>:20:76: error: '()' is not convertible to 'UnsafePointer<CGAffineTransform>'
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer().initialize(newvalue: myTransform)
поэтому я попытался явно называть тип:
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer<CGAffineTransform>().initialize(newvalue: myTransform)
а затем я получаю другую ошибку:
Playground execution failed: error: <REPL>:20:95: error: could not find an overload for 'init' that accepts the supplied arguments
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer<CGAffineTransform>().initialize(newvalue: myTransform)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Автозаполнение предполагает, что это должно работать?
Ответы
Ответ 1
Простейшим решением является функция withUnsafePointer
:
let myFont = CTFontCreateWithName("Helvetica", 12, nil)
let myGlyph = CTFontGetGlyphWithName(myFont, "a")
var myTransform = CGAffineTransformIdentity
var path = withUnsafePointer(&myTransform) { (pointer: UnsafePointer<CGAffineTransform>) -> (CGPath) in
return CTFontCreatePathForGlyph(myFont, myGlyph, pointer)
}
initialize
не является конструктором. Вы должны были бы alloc
создать новую память с помощью UnsafePointer<T>.alloc
, затем initialize
, а затем dealloc
. Функция withUnsafePointer
делает это для вас.
Обратите внимание, что myTransform
не может быть константой (var
not let
), иначе вы не можете использовать его для параметра inout
(&myTransform
).