27

我有一个自 Swift 3 发布以来已弃用的收据验证类。我解决了一些问题,但我仍然有很多...

这是我使用的 GitHub 源代码:https ://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swift和https://gist.github.com/baileysh9/eddcba49d544635b3cf5

  1. 第一个错误:

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

编译器抛出:无法使用 UnsafeRawPointer 类型的参数列表调用 UnsafePointer(UInt8) 类型的初始化程序

  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)
4

3 回答 3

46
  1. 在 Swift 3 中,您不能UnsafePointer使用UnsafeRawPointer.

    您可以使用assumingMemoryBound(to:)将 a 转换UnsafeRawPointerUnsafePointer<T>. 像这样:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)
    
  2. 使用debugDescriptionordistance(to:)比较两个指针。

    while(ptr.debugDescription < endPtr.debugDescription)
    

    或者

    while(ptr.distance(to:endPtr) > 0)
    
于 2016-10-04T04:10:49.493 回答
0

可以将常规指针符号 i C&放在 Int8 数组或 Uint8 数组的前面,以生成提供 C 函数输入的指针。就像下面的 &aBuffer 数组(但数据数组必须先复制到本地,以控制数据存储的存储直到操作完成,否则会出错)。在处理 dropInteraction 数据的例程中(传递一个字节数组):

func interpretInstanceData(filename: String, Buffer: [UInt8]) -> String {
    var aBuffer = Buffer
    let sInstanceData = String(cString: Ios_C_InterpretInstanceData(filename, &aBuffer, Int32(aBuffer.count)))

这个问题有点老了。但是在谷歌上搜索关于将 swift 字节数组转换为 C 指针的解决方案(还有什么是 UnsafePointer< UInt8 >)。这个问题引起了轰动。但我认为这个答案对后来的 Swift 版本(我使用的)很有帮助。即使在那时也会起作用。在任何需要 swift 指针的用途中工作(只需先制作正确类型的数组)。

于 2020-06-08T21:37:24.710 回答
-1

最近可能已更改为仅此,没有“.bytes”。部分:

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

从原文:

var p = UnsafePointer<UInt8>(data.bytes)
于 2017-01-24T19:58:53.960 回答