簡體   English   中英

不安全指針<UInt8> Swift 3 中的初始化程序

[英]UnsafePointer<UInt8> initializer in Swift 3

我有一個自 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)

編譯器拋出:無法使用 UnsafeRawPointer 類型的參數列表調用 UnsafePointer(UInt8) 類型的初始化程序

  1. 第二個錯誤

    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)
  1. 在斯威夫特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)

可以在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM