web-dev-qa-db-fra.com

UnsafePointer <UInt8> initialiseur dans Swift 3

J'ai une classe de validation de reçu qui est déconseillée depuis Swift 3 est sorti. J'ai corrigé quelques problèmes, mais j'en ai encore beaucoup ...

Voici le code source GitHub que j'ai utilisé: https://Gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-Swift et https://Gist.github.com/ baileysh9/eddcba49d544635b3cf5

  1. Première erreur:

        var p = UnsafePointer<UInt8>(data.bytes)
    

Le compilateur lance: Impossible d'appeler l'initialiseur pour le type UnsafePointer (UInt8) avec une liste d'arguments de type UnsafeRawPointer

  1. Deuxième erreur

    while (ptr < end)
    

Les opérateurs binaires <ne peuvent pas être appliqués à deux opérandes UnsafePointer (UInt8)

Merci beaucoup d'avance :)

[~ # ~] modifier [~ # ~]

Grâce à la réponse de LinShiwei, j'ai trouvé une solution à la déclaration UnsafePointer. Il compile mais n'a pas encore été testé (car d'autres erreurs m'évitent de tester):

 func getProductIdFromReceipt(_ data:Data) -> String?
{
  let tempData: NSMutableData = NSMutableData(length: 26)!
  data.withUnsafeBytes {
        tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes: $0)
    }

    var p: UnsafePointer? = tempData.bytes.assumingMemoryBound(to: UInt8.self)
21
GrayFox
  1. Dans Swift 3, vous ne pouvez pas initier un UnsafePointer en utilisant un UnsafeRawPointer.

    Vous pouvez utiliser assumingMemoryBound(to:) pour convertir un UnsafeRawPointer en un UnsafePointer<T>. Comme ça:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)
    
  2. Utilisez debugDescription ou distance(to:) pour comparer deux pointeurs.

    while(ptr.debugDescription < endPtr.debugDescription)
    

    ou

    while(ptr.distance(to:endPtr) > 0)
    
38
LinShiwei