2016-09-28 11 views
16

Mam klasę sprawdzania poprawności paragonu, która jest przestarzała od czasu wydania Swift 3. Poprawiłem kilka problemów, ale nadal mam wiele ...UnsafePointer <UInt8> inicjator w Swift 3

Oto kod źródłowy GitHub użyłem: https://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swift i https://gist.github.com/baileysh9/eddcba49d544635b3cf5

  1. pierwszy błąd:

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

Compiler throws: Nie można wywołać inicjalizatora dla typu UnsafePointer (UInt8) z listą argumentów typu UnsafeRawPointer

  1. Drugi błąd

    while (ptr < end) 
    

operatory binarne < nie mogą być stosowane do dwóch UnsafePointer (Uint8) argumentów

Dziękuję bardzo dużo wcześniej:)

EDIT

Dzięki odpowiedzi LinShiwei znalazłem rozwiązanie do deklaracji UnsafePointer. Kompiluje ale jeszcze nie testowane (bo inne błędy uniknąć mnie do przetestowania):

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) 

Odpowiedz

27
  1. w Swift 3, nie można init, to UnsafePointer stosując UnsafeRawPointer.

    Możesz użyć assumingMemoryBound(to:), aby przekształcić UnsafeRawPointer w UnsafePointer<T>. Tak:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self) 
    
  2. Zastosowanie debugDescription lub distance(to:) porównać dwa wskaźnik.

    while(ptr.debugDescription < endPtr.debugDescription) 
    

    lub

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

Ok dziękuję, to pomogło :)! I Edytuj moje pytanie, aby dodać nowy kod, ponieważ jest nieco bardziej skomplikowany – GrayFox

+0

@GrayFox Na czym polega problem? – LinShiwei

+0

data.bytes.assumingMemoryBound (do: UInt8.self) nie działa, ponieważ "bajty" zgłaszają błąd kompilatora: "musi użyć UnsafeBytes zamiast bajtów". Dodałem cały blok do sekcji EDYCJA;). Teraz to działa, ale mam inne nowe błędy w device.identifierForVendor.getBytes (UnsafeMutablePointer (mutableData !.mutableBytes)), który jest: "Nie można wywołać init typu UnsafeMutablePointer z listą argumentów typu UnsafeMutableRawPointer" ... – GrayFox

-1

Może ostatnio zmieniona właśnie tego, bez ".bytes". część:

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

od oryginału:

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