我有一个收据验证类,自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)
编译器抛出:无法使用类型为UnsafeRawPointer
的参数列表调用类型UnsafePointer(UInt8)的初始值设定项第二个错误
while (ptr < end)
二元运算符&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)
答案 0 :(得分:36)
在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)
答案 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
答案 2 :(得分:-1)
最近可能没有&#34; .bytes更改为这个。&#34;部分:
var p: UnsafePointer = data.assumingMemoryBound(to: UInt8.self)
来自原文:
var p = UnsafePointer<UInt8>(data.bytes)