Swift 3中的UnsafePointer <uint8>初始化程序

时间:2016-09-28 12:12:53

标签: ios swift3 unsafe-pointers

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

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

  1. 第一个错误:

        var p = UnsafePointer<UInt8>(data.bytes)
    
  2. 编译器抛出:无法使用类型为UnsafeRawPointer

    的参数列表调用类型UnsafePointer(UInt8)的初始值设定项
    1. 第二个错误

      while (ptr < end)
      
    2. 二元运算符&lt;不能应用于两个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)
      

3 个答案:

答案 0 :(得分:36)

  1. 在Swift 3中,您无法使用UnsafePointer初始化UnsafeRawPointer

    您可以使用assumingMemoryBound(to:)UnsafeRawPointer转换为UnsafePointer<T>。像这样:

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

    while(ptr.debugDescription < endPtr.debugDescription)
    

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

答案 1 :(得分:0)

可以在Int8数组或Uint8数组前面放置一个常规指针符号i C &,以使指针提供C函数输入。下面的数组(但是数据数组必须首先在本地复制,以保持对数据存储设备的控制,直到操作完成为止,否则会出现错误)。在例程中处理dropInteraction数据(传递字节数组):

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

问题有点老了。但是,搜索有关将快速字节数组转换为C指针(否则为UnsafePointer )的主题的解决方案。这个问题引起了轰动。但是我认为这个答案对我使用的更高版本的Swift很有帮助。即使那样,本来还是可以的。可以在需要使用swift指针的任何类型的工作中使用(只需首先创建正确类型的数组即可。)

答案 2 :(得分:-1)

最近可能没有&#34; .bytes更改为这个。&#34;部分:

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

来自原文:

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