Как правильно инициализировать 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).