从CGAffineTransform到UnsafePointer<CGAffineTransform>

8
我正在尝试在Swift中创建CGPath。我使用CGPathCreateWithRect(rect,transformPointer)
如何从CGAffineTransform获取UnsafePointer<CGAffineTransform>?我尝试了以下方法:
    let transform : CGAffineTransform = CGAffineTransformIdentity
    let transformPointer : UnsafePointer<CGAffineTransform> = UnsafePointer(transform)

我也尝试了这个方法:
    let transform : CGAffineTransform = CGAffineTransformIdentity
    let transformPointer : UnsafePointer<CGAffineTransform> = &transform 

但是Swift抱怨一个'&'与非inout类型的参数...。我也尝试将&transform直接传递到CGPathCreateWithRect中,但会出现相同的错误。
当我直接传递transform时,Swift会显示"无法将类型为'CGAffineTransform'的值转换为预期的参数类型'UnsafePointer'"。
发生了什么事情?如何使之在Swift 2.1中工作?
2个回答

18

我也尝试将&transform直接传递到CGPathCreateWithRect中...

你已经接近成功了。为了将transform作为输入输出参数通过&传递,它需要是一个变量

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

了解更多信息,请参见“与C API交互”中的“在使用Swift与Cocoa和Objective-C”文档中。


Swift 3中,这将是

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

或者,对于恒等变换,只需

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

在最新的Swift/Xcode中,这个var transform = CGAffineTransformIdentity会生成以下错误:CGAffineTransformIdentity在Swift中不可用。 - Confused
第二个,用nil的,对我来说就像是一道美食,一道彩虹在我的耳边,一首音乐在我的舌尖上! - Confused
哇,非常感谢!顺便说一下,Swift 5 中的语法很好:path.copy(using: &transform) - 非常直观。 - Erik van der Neut

3

@Martin R提供了最好的答案,但是作为替代方案,我喜欢这样使用我的不安全可变指针,以防将来需要更改实际指针

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

1
您不需要一个可变指针,也不需要指针转换,因此可以缩短为withUnsafePointer(&transform) { CGPathCreateWithRect(CGRect(), $0) }。我相当确定CGPathCreateWithRect() 复制数据而不保留指针。否则,在C中,您可以将(本地)数组的地址传递给该函数,这将无法使用。 - Martin R
没错,我对CGPathCreateWithRect并不是百分之百熟悉,我只是根据记忆处理各种情况中的不安全指针。 - Knight0fDragon
1
为什么这是答案?我更倾向于首先使用Martin R的方式,他应该得到完全的答案信用,我只是指出了一种不同的使用不安全的可变指针的方法,以防人们遇到这个问题。 - Knight0fDragon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接