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 
    } 
} 

这是从网站:

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

然而,这打破了斯威夫特3对于以下行:

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

以下错误:

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

我明白,这是关系到改变斯威夫特3:UnsafeRawPointerMigration

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

不过,我不太清楚最好的方式将此移植到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 
    } 
} 
+0

在斯威夫特4,以'elementsPointer'不会编译开始尾随关闭;错误是“无法推断复杂的封闭返回类型;添加显式类型以消除歧义”。 Xcode建议添加这个注释:'elementsPointer - > @lvalue [Path Element]'但采取这个建议只会导致更多的错误。任何提示? –