2016-10-03 43 views
0

我使用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.您將能夠在這方面提供一些幫助,爲上述擴展更新代碼?

回答

0

我直接就這個問題伸出了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]'但採取這個建議只會導致更多的錯誤。任何提示? –

相關問題