如何在Swift中正确初始化非安全指针?
我正在尝试使用如何在Swift中正确初始化非安全指针?,swift,Swift,我正在尝试使用CTFontCreatePathForGlyph(font:CTFont?,glyph:cglyph,transform:CConstPointer): 但是如何正确地将myTransform传递到CTFontCreatePathForGlyph 我尝试创建一个myTransformPointer传递给函数,如下所示: var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer().i
CTFontCreatePathForGlyph(font:CTFont?,glyph:cglyph,transform:CConstPointer)
:
但是如何正确地将myTransform
传递到CTFontCreatePathForGlyph
我尝试创建一个myTransformPointer
传递给函数,如下所示:
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer().initialize(newvalue: myTransform)
var myTransformPointer:UnsafePointer=UnsafePointer()。初始化(newvalue:myTransform)
但我得到了这个错误:
Playground execution failed: error: <REPL>:20:76: error: '()' is not convertible to 'UnsafePointer<CGAffineTransform>'
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer().initialize(newvalue: myTransform)
执行失败:错误::20:76:错误:“()”不能转换为“UnsafePointer”
var myTransformPointer:UnsafePointer=UnsafePointer().initialize(newvalue:myTransform)
因此,我尝试显式命名类型:
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer<CGAffineTransform>().initialize(newvalue: myTransform)
var myTransformPointer:UnsafePointer=UnsafePointer()。初始化(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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
执行失败:错误::20:95:错误:找不到接受所提供参数的“init”的重载
var myTransformPointer:UnsafePointer=UnsafePointer().initialize(newvalue:myTransform)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
自动完成提示这应该可以工作?最简单的解决方案是使用
with unsafepointer
函数:
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)
}
让myFont=CTFontCreateWithName(“Helvetica”,12,无)
让myGlyph=CTFontGetGlyphWithName(myFont,“a”)
var myTransform=CGAffineTransformity
var path=withUnsafePointer(&myTransform){(指针:UnsafePointer)->(CGPath)在
返回CTFontCreatePathForGlyph(myFont、myGlyph、指针)
}
初始化
不是构造函数。您必须alloc
使用UnsafePointer.alloc
创建一个新内存,然后initialize
,然后dealloc
。带有unsafepointer的函数可以为您完成所有这些
请注意,myTransform
不能是常量(var
notlet
),否则您不能将其用于inout
参数(&myTransform
)。我只是在操场上试过,没有给出错误,但是它将path
作为\uu NSCFType
而不是预期的CGPath
提供。将在应用程序中进行测试,以确定这是否是游乐场问题。谢谢你的回复!我在文档中看到了withunsaepointer
函数,但我完全没有看到它也可以用来创建指针;在应用程序中工作,但不在操场中工作。也许这是对运动场的有意限制,因为我在另一个问题(链接)中遇到了类似的问题。如果是这样的话,如果操场抛出了一个错误,而不是仅仅给出有点不透明的\uu NSCFType
,那就好了。。。再次感谢你的回答@Matthew它是\uu NSCFType
,因为CGPath
没有真正的运行时类型。即使在Obj-C中,您也无法获得CGPath
的类型,因为它是C结构,而不是Obj-C对象。感谢您的解释!我确认它在操场上也能起作用。我原以为这不是因为当我尝试使用路径构建NSBezierPath
时它不起作用——我认为这不是因为它显示的是\uuu NSCFType
而不是cRect
(谷歌建议可能是一个与内存相关的bug),而实际上这只是我的一个语法错误。哎呀。
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)
}