2015-09-03 8 views
6

के लिए हम स्विफ्टतेज 2.0 कीचेन प्रकार त्रुटियों SecItemCopyMatching

के पिछले संस्करण
var retrievedData: NSData? 
    var extractedData: Unmanaged<AnyObject>? = nil 
    let status = SecItemCopyMatching(keyChainQuery, &extractedData) 

    if (status == errSecSuccess) { 
     if let validExtractedData = extractedData { 
      let opaque = validExtractedData.toOpaque() 
      retrievedData = Unmanaged<NSData>.fromOpaque(opaque).takeUnretainedValue() 
     } 
    } 

हालांकि यह अब हमें निम्नलिखित त्रुटि देता है के साथ कोड के इस स्निपेट था:

Cannot convert value of type 'inout Unmanaged?' (aka 'inout Optional>') to expected argument type 'UnsafeMutablePointer' (aka 'UnsafeMutablePointer>')

मैं थोड़ा हूँ इसे ठीक करने के तरीके पर खो गया। मुझे लगता है कि मुझे कुछ मेमोरी आवंटित करनी है, इसे एक असुरक्षित म्यूचिकेटर बनाना है और फिर इसे SecItemCopyMatching में आपूर्ति करें?

मैं इस कोशिश की:

let sizeOfKey = 32 
    var store = NSMutableData(capacity: sizeOfKey)! 
    let status = SecItemCopyMatching(keyChainQuery, store.bytes) 

लेकिन यह मुझे एक दिया:

Cannot convert value of type 'UnsafePointer' (aka 'UnsafePointer<()>') to expected argument type 'UnsafeMutablePointer' (aka 'UnsafeMutablePointer>') error

किसी को भी एक विचार?

उत्तर

26

ऐसा लगता है, हमें Unmanaged<> अब और काम करने की आवश्यकता नहीं है।

प्रयास करें:

var retrievedData: NSData? 
var extractedData: AnyObject? 
let status = SecItemCopyMatching(keyChainQuery, &extractedData) 

if (status == errSecSuccess) { 
    retrievedData = extractedData as? NSData 
} 
+0

ठीक संकलित करने के लिए लगता है! क्या आप समझा सकते हैं कि आप इस समाधान में कैसे आए? कंपाइलर चाहता है: UnsafeMutablePointer <वैकल्पिक > अभी तक स्पष्ट रूप से AnyObject? ठीक है ठीक है? – Toad

+3

देखें [यह दस्तावेज़] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_16)। हम 'unsafeMutablePointer ' पैरामीटर में इन-आउट ('&') अभिव्यक्ति पास कर सकते हैं। जब यह 'असुरक्षित म्यूचुअल पॉइंटर <वैकल्पिक >' स्वीकार करता है, तो हम 'परिणाम' पास कर सकते हैं यदि 'परिणाम' 'वैकल्पिक ' a.k.a. Any Anybject? 'Variable है। – rintaro

0

बाद पेचीदा कुछ और मैं इस समाधान के साथ आ गया है:

var retrievedData: NSData? 
    let sizeOfKey = 32 
    let store = UnsafeMutablePointer<AnyObject?>.alloc(sizeof(AnyObject?) * sizeOfKey) 
    let status = SecItemCopyMatching(keyChainQuery, store) 

    if (status == errSecSuccess) { 
     retrievedData = NSData(bytesNoCopy: store, length: sizeOfKey, freeWhenDone: true) 
    } 

कौन सा संकलित करता है। मुझे यकीन नहीं है कि यह वास्तव में अभी तक काम करता है। अगर ऐसा होता है तो मैं इस पोस्ट को अपडेट करूंगा। इस बीच यदि जानकार लोग इस पर टिप्पणी कर सकते हैं तो यह बहुत अच्छा होगा!

संबंधित मुद्दे