【问题标题】:UnsafePointer<CGAffineTransform> from CGAffineTransform来自 CGAffineTransform 的 UnsafePointer<CGAffineTransform>
【发布时间】:2016-03-24 09:50:14
【问题描述】:

我正在尝试在 Swift 中创建一个 CGPath。我正在使用CGPathCreateWithRect(rect, transformPointer)。

如何从CGAffineTransform 获得UnsafePointer&lt;CGAffineTransform&gt;?我试过这个:

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

我也试过这个:

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

但 Swift 抱怨 '&amp;' with non-inout argument of type...。我也尝试过将&amp;transform 直接传递给CGPathCreateWithRect,但这会因同样的错误而停止。

当我直接传入transform 时,Swift “无法将 'CGAffineTransform' 类型的值转换为预期的参数类型 'UnsafePointer'”。

发生了什么,如何在 Swift 2.1 中实现这一点?

【问题讨论】:

    标签: swift pointers unsafe-pointers


    【解决方案1】:

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

    你快到了。 transform 需要是一个变量 为了将其作为 inout 参数与&amp; 一起传递:

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

    欲了解更多信息,请参阅"Interacting with C APIs" 在“将 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 中不可用
    • 第二个,零,对我来说是食物,是我耳朵里的彩虹和我舌头上的音乐!
    • 哇,非常感谢! Swift 5 中的语法很好,顺便说一句:path.copy(using: &amp;transform) - 非常直观。
    【解决方案2】:

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

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

    【讨论】:

    • 你不需要 mutable 指针,也不需要指针转换,因此可以将其缩短为withUnsafePointer(&amp;transform) { CGPathCreateWithRect(CGRect(), $0) }。 – 我相当确定 CGPathCreateWithRect() 复制 数据并且不保留指针。否则它将在 C 中无法使用,您可以将(本地)数组的地址传递给该函数。
    • 是的,我对 CGPathCreateWithRect 并不是 100% 熟悉,我只是想了解如何处理各种情况下的不安全指针
    • 为什么是这个答案?我宁愿首先使用 Martin R 方式,他应该得到充分的答案,我只是为不安全的可变指针指出一种不同的方式,以防人们遇到这个问题
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 2015-11-28
    • 2010-10-08
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多