27

Swift 3 がリリースされてから廃止されたレシート検証クラスがあります。いくつかの問題を修正しましたが、まだ多くの問題があります...

私が使用した GitHub ソース コードは次のとおりです

  1. 最初のエラー:

        var p = UnsafePointer<UInt8>(data.bytes)
    

コンパイラのスロー: UnsafeRawPointer 型の引数リストを使用して UnsafePointer(UInt8) 型の初期化子を呼び出すことはできません

  1. 2 番目のエラー

    while (ptr < end)
    

二項演算子 < は 2 つの 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)
4

3 に答える 3

46
  1. UnsafePointerSwift 3 では、を使用して を初期化することはできませんUnsafeRawPointer

    assumingMemoryBound(to:)を に変換するためにUnsafeRawPointer使用できますUnsafePointer<T>。このような:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)
    
  2. debugDescriptionまたはを使用distance(to:)して、2 つのポインターを比較します。

    while(ptr.debugDescription < endPtr.debugDescription)
    

    また

    while(ptr.distance(to:endPtr) > 0)
    
于 2016-10-04T04:10:49.493 に答える