web-dev-qa-db-ja.com

UnsafePointer <UInt8>イニシャライザーSwift 3

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

私が使用したGitHubのソースコードは次のとおりです。 https://Gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-Swift および https://Gist.github.com/ baileysh9/eddcba49d544635b3cf5

  1. 最初のエラー:

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

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

  1. 2番目のエラー

    while (ptr < end)
    

二項演算子<は、2つのUnsafePointer(UInt8)オペランドに適用できません

ありがとう事前に:)

[〜#〜] edit [〜#〜]

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)
21
GrayFox
  1. Swift 3)では、UnsafePointerを使用して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)
    _
38
LinShiwei