UnsafePointer <UInt8> инициализатор в Swift 3
У меня есть класс проверки квитанции, который устарел, поскольку Swift 3 выпустил. Я исправил некоторые проблемы, но у меня еще много...
Вот исходный код GitHub, который я использовал: https://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swift и https://gist.github.com/baileysh9/eddcba49d544635b3cf5
Вывод компилятора: Невозможно вызвать инициализатор для типа UnsafePointer (UInt8) с списком аргументов типа UnsafeRawPointer
-
Вторая ошибка
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)