GrayFox GrayFox - 1 year ago 233
iOS Question

UnsafePointer<UInt8> initializer in Swift 3

I have a receipt validation class that is deprecated since Swift 3 has released. I fixed some issues, but I still have many ...

Here is the GitHub source code I used : and

  1. First Error :

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

Compiler throws : Cannot invoke initializer for type UnsafePointer(UInt8) with an argument list of type UnsafeRawPointer

  1. Second error

    while (ptr < end)

Binary operators < cannot be applied to two UnsafePointer(UInt8) operands

Thank you very much in advance :)


Thanks to LinShiwei answer I found a solution to UnsafePointer declaration. It compiles but not tested yet (because other errors avoid me to test) :

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)

Answer Source
  1. In Swift 3, you cannot init an UnsafePointer using an UnsafeRawPointer.

    You can use assumingMemoryBound(to:) to convert an UnsafeRawPointer into an UnsafePointer<T>. Like this:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)
  2. Use debugDescription or distance(to:) to compare two pointer.

    while(ptr.debugDescription < endPtr.debugDescription)


    while(ptr.distance(to:endPtr) > 0)
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download