2016-09-28 12 views
16

में प्रारंभकर्ता मेरे पास एक रसीद सत्यापन कक्षा है जिसे स्विफ्ट 3 जारी होने के बाद बहिष्कृत किया गया है। मैं कुछ समस्याओं का हल नहीं है, लेकिन मैं अभी भी कई ...UnsafePointer <UInt8> स्विफ्ट 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

,210
  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) 

उत्तर

27
  1. स्विफ्ट 3 में, आप एक UnsafeRawPointer का उपयोग कर एक UnsafePointer init नहीं कर सकते।

    आप का उपयोग UnsafeRawPointer को UnsafePointer<T> में परिवर्तित करने के लिए कर सकते हैं। इस तरह:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self) 
    
  2. उपयोग debugDescription या distance(to:) दो सूचक तुलना करने के लिए।

    while(ptr.debugDescription < endPtr.debugDescription) 
    

    या

    while(ptr.distance(to:endPtr) > 0) 
    
+0

ठीक है, धन्यवाद, यह मदद की :)! मैं अपना नया कोड जोड़ने के लिए अपना प्रश्न संपादित करता हूं क्योंकि यह थोड़ा और जटिल है – GrayFox

+0

@ ग्रेफॉक्स समस्या क्या है? – LinShiwei

+0

data.bytes.assumingMemoryBound (करने के लिए: UInt8.self) काम नहीं करता है क्योंकि 'बाइट्स' एक कंपाइलर त्रुटि फेंकता है: "बाइट्स के बजाय असुरक्षित बाइट्स का उपयोग करने की आवश्यकता है"। मैंने पूरे ब्लॉक को ईडीआईटी अनुभाग में जोड़ा;)। अब, यह काम करता है लेकिन मेरे पास डिवाइस में अन्य नई त्रुटियां हैं IidentifierForVendor.getBytes (UnsafeMutablePointer (mutableData !.mutableBytes)) जो है: "UnsafeMutablePoinPointer के प्रकार की तर्क सूची के साथ UnsafeMutablePointer प्रकार का उपयोग नहीं कर सकता" .... – GrayFox

-1

हाल ही में बिना सिर्फ इस लिए, परिवर्तित हो सकती है ".bytes।" भाग:

var p: UnsafePointer = data.assumingMemoryBound(to: UInt8.self) 
मूल से

:

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