UnsafeMutablePointer使用3
问题描述:
我使用UIBezierPath以下扩展名:UnsafeMutablePointer使用3
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
}
}
这是从网站:
然而,这打破了斯威夫特3对于以下行:
let elementsPointer = UnsafeMutablePointer<[PathElement]>(userInfo)
显示
以下错误:
Cannot invade initializer for type 'UnsafeMutablePointer<[PathElement]>' with an argument list of type '(UnsafeMutableRawPointer?)'
我明白,这是关系到改变斯威夫特3:UnsafeRawPointerMigration
不过,我不太清楚最好的方式将此移植到Swift 3.您将能够在这方面提供一些帮助,为上述扩展更新代码?
答
我直接就这个问题伸出了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
}
}
在斯威夫特4,以'elementsPointer'不会编译开始尾随关闭;错误是“无法推断复杂的封闭返回类型;添加显式类型以消除歧义”。 Xcode建议添加这个注释:'elementsPointer - > @lvalue [Path Element]'但采取这个建议只会导致更多的错误。任何提示? –