UnsafePointer <UInt8> инициализатор в Swift 3

У меня есть класс проверки квитанции, который устарел, поскольку Swift 3 выпустил. Я исправил некоторые проблемы, но у меня еще много...

Вот исходный код GitHub, который я использовал: https://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swift и https://gist.github.com/baileysh9/eddcba49d544635b3cf5

  • Первая ошибка:

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

Вывод компилятора: Невозможно вызвать инициализатор для типа UnsafePointer (UInt8) с списком аргументов типа UnsafeRawPointer

  1. Вторая ошибка

    while (ptr < end)
    

Двоичные операторы < не может применяться к двум операндам UnsafePointer (UInt8)

Спасибо за заблаговременно:)

ИЗМЕНИТЬ

Благодаря ответу LinShiwei я нашел решение для объявления UnsafePointer. Он компилируется, но еще не проверен (поскольку другие ошибки не позволяют мне проверять):

 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)

Ответы

Ответ 1

  • В Swift 3 вы не можете инициализировать UnsafePointer с помощью UnsafeRawPointer.

    Вы можете использовать assumingMemoryBound(to:) для преобразования UnsafeRawPointer в UnsafePointer<T>. Вот так:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)
    
  • Используйте debugDescription или distance(to:) для сравнения двух указателей.

    while(ptr.debugDescription < endPtr.debugDescription)
    

    или

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

Ответ 2

Возможно, недавно он изменился до этого, без ".bytes". часть:

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

из оригинала:

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