Swift 3 中的 UnsafePointer<UInt8> 初始化器
UnsafePointer<UInt8> initializer in Swift 3
我有一个收据验证 class,自 Swift 3 发布以来已弃用。我解决了一些问题,但我还有很多问题...
这是我使用的 GitHub 源代码:https://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swift and https://gist.github.com/baileysh9/eddcba49d544635b3cf5
第一个错误:
var p = UnsafePointer<UInt8>(data.bytes)
编译器抛出:无法使用 UnsafeRawPointer 类型的参数列表调用 UnsafePointer(UInt8) 类型的初始值设定项
第二个错误
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: [=14=])
}
var p: UnsafePointer? = tempData.bytes.assumingMemoryBound(to: UInt8.self)
在 Swift 3 中,您不能使用 UnsafeRawPointer
.
初始化 UnsafePointer
您可以使用 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)
最近可能只更改为这个,没有“.bytes”。部分:
var p: UnsafePointer = data.assumingMemoryBound(to: UInt8.self)
来自原文:
var p = UnsafePointer<UInt8>(data.bytes)
可以在 Int8 数组或 Uint8 数组前面放置一个常规的指针符号 i C &
来制作一个指针来提供 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 的指针的任何类型的使用中工作(只需首先制作正确类型的数组)。
我有一个收据验证 class,自 Swift 3 发布以来已弃用。我解决了一些问题,但我还有很多问题...
这是我使用的 GitHub 源代码:https://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swift and https://gist.github.com/baileysh9/eddcba49d544635b3cf5
第一个错误:
var p = UnsafePointer<UInt8>(data.bytes)
编译器抛出:无法使用 UnsafeRawPointer 类型的参数列表调用 UnsafePointer(UInt8) 类型的初始值设定项
第二个错误
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: [=14=])
}
var p: UnsafePointer? = tempData.bytes.assumingMemoryBound(to: UInt8.self)
在 Swift 3 中,您不能使用
初始化UnsafeRawPointer
.UnsafePointer
您可以使用
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)
最近可能只更改为这个,没有“.bytes”。部分:
var p: UnsafePointer = data.assumingMemoryBound(to: UInt8.self)
来自原文:
var p = UnsafePointer<UInt8>(data.bytes)
可以在 Int8 数组或 Uint8 数组前面放置一个常规的指针符号 i C &
来制作一个指针来提供 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 的指针的任何类型的使用中工作(只需首先制作正确类型的数组)。