2016-10-03 1 views
0

J'utilise l'extension suivante pour UIBezierPath:utilisation UnsafeMutablePointer à Swift 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 
    } 
} 

Ceci est du site:

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

Cependant, cela rompt avec Swift 3 pour la ligne suivante:

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

erreur suivant apparaît:

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

Je comprends que cela est lié au changement de Swift 3: UnsafeRawPointerMigration

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

Cependant, je ne suis pas tout à fait sûr la La meilleure façon de porter ceci à Swift 3. Seriez-vous capable de fournir de l'aide à cet égard avec le code mis à jour pour l'extension ci-dessus?

Répondre

0

J'ai contacté Ole Begemann directement à propos de cette question. Il a été très utile et a rapidement fourni un code mis à jour qui fonctionne avec Swift 3. Partage le même si quelqu'un d'autre se heurte au même problème.

Cela devrait fonctionner:

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

Swift 4, la fermeture de fin qui commence par 'elementsPointer' ne compilera pas; l'erreur est "Impossible d'inférer le type de retour de fermeture complexe, ajouter un type explicite pour désamorcer". Xcode suggère d'ajouter cette annotation: 'elementsPointer -> @lvalue [Path Element]' mais en prenant cette suggestion, il y a plus d'erreurs. Des indices? –