【问题标题】:UnsafeMutablePointer usage in Swift 3Swift 3 中的 UnsafeMutablePointer 用法
【发布时间】:2016-10-03 05:42:33
【问题描述】:

我正在为 UIBezierPath 使用以下扩展:

extension UIBezierPath {

    var elements: [PathElement] {

        var pathElements = [PathElement]()

        withUnsafeMutablePointer(&pathElements) { elementsPointer in

            CGPathApply(CGPath, elementsPointer) { (userInfo, nextElementPointer) in

                let nextElement = PathElement(element: nextElementPointer.memory)

                let elementsPointer = UnsafeMutablePointer<[PathElement]>(userInfo)

                elementsPointer.memory.append(nextElement)
            }
        }
        return pathElements
    }
}

这是来自网站:

https://oleb.net/blog/2015/06/c-callbacks-in-swift/

但是,以下行与 Swift 3 不同:

let elementsPointer = UnsafeMutablePointer<[PathElement]>(userInfo)

显示以下错误:

Cannot invade initializer for type 'UnsafeMutablePointer<[PathElement]>' with an argument list of type '(UnsafeMutableRawPointer?)'

我了解这与 Swift 3 中的更改有关:UnsafeRawPointerMigration

https://swift.org/migration-guide/se-0107-migrate.html

但是,我不太确定将其移植到 Swift 3 的最佳方式。您能否通过上述扩展的更新代码在这方面提供一些帮助?

【问题讨论】:

    标签: uibezierpath initializer unsafemutablepointer


    【解决方案1】:

    我就这个问题直接联系了 Ole Begemann。他非常乐于助人,并及时提供了适用于 Swift 3 的更新代码。如果其他人也遇到同样的问题,请分享相同的代码。

    这应该可行:

    extension UIBezierPath {
    
        var elements: [PathElement] {
    
            var pathElements = [PathElement]()
    
            withUnsafeMutablePointer(to: &pathElements) { elementsPointer in
    
                let rawElementsPointer = UnsafeMutableRawPointer(elementsPointer)
    
                cgPath.apply(info: rawElementsPointer) { userInfo, nextElementPointer in
    
                    let nextElement = PathElement(element: nextElementPointer.pointee)
    
                    let elementsPointer = userInfo?.assumingMemoryBound(to: [PathElement].self)
    
                    elementsPointer?.pointee.append(nextElement)
                }
            }
    
            return pathElements
        }
    }
    

    【讨论】:

    • 在 Swift 4 中,以 elementsPointer 开头的尾随闭包不会编译;错误是“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。 Xcode 建议添加此注释:elementsPointer -&gt; @lvalue [Path Element],但采纳此建议只会导致更多错误。有什么提示吗?
    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多