![](/img/trans.png)
[英]Issue with UnsafePointer<Uint8> in SQLite project in Swift
[英]UnsafePointer<UInt8> initializer in Swift 3
我有一个自 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)
二元运算符 < 不能应用于两个 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,你不能初始化一个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)
可以在 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 的指针的任何类型的使用中工作(只需首先创建正确类型的数组)。
最近可能已更改为仅此,没有“.bytes”。 部分:
var p: UnsafePointer = data.assumingMemoryBound(to: UInt8.self)
来自原文:
var p = UnsafePointer<UInt8>(data.bytes)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.