2016-09-28 1 views
16

J'ai une classe de validation de reçu qui est obsolète depuis la publication de Swift 3. Je fixe quelques questions, mais je dois encore beaucoup ...UnsafePointer <UInt8> initialiseur dans Swift 3

Voici le code source GitHub je: 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) 
    

compilateur throws: 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 peut pas être appliquée à deux UnsafePointer (Uint8) opérandes

Merci beaucoup à l'avance:)

EDIT

Grâce à la réponse de LinShiwei, j'ai trouvé une solution à la déclaration UnsafePointer. Il compile, mais pas encore testé (parce que d'autres erreurs me é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) 

Répondre

27
  1. Swift 3, vous ne pouvez pas initialiser un UnsafePointer en utilisant un UnsafeRawPointer. Vous pouvez utiliser assumingMemoryBound(to:) pour convertir un UnsafeRawPointer en UnsafePointer<T>. Comme ceci:

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

    while(ptr.debugDescription < endPtr.debugDescription) 
    

    ou

    while(ptr.distance(to:endPtr) > 0) 
    
+0

merci D'accord, cela a aidé :)! Je modifie ma question pour ajouter mon nouveau code parce que c'est un peu plus complexe – GrayFox

+0

@GrayFox Quel est le problème? – LinShiwei

+0

data.bytes.assumingMemoryBound (à: UInt8.self) ne fonctionne pas car 'bytes' génère une erreur de compilation: "doit utiliser UnsafeBytes au lieu de bytes". J'ai ajouté le bloc entier dans la section EDIT;). Maintenant, cela fonctionne mais j'ai d'autres nouvelles erreurs dans device.identifierForVendor.getBytes (UnsafeMutablePointer (mutableData!mutableBytes)) qui est: "Impossible d'invoquer init de type UnsafeMutablePointer avec la liste d'arguments de type UnsafeMutableRawPointer" .... – GrayFox

-1

mai ont récemment changé juste cela, sans les ".bytes." partie:

var p: UnsafePointer = data.assumingMemoryBound(to: UInt8.self) 

de l'original:

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