[英]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.