2015-09-03 6 views
6

Wir sind mit der vorherige Version von Swift diese Code-Snippet hattenswift 2.0 keychain Art Fehler für 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() 
     } 
    } 

jedoch jetzt das gibt uns die folgende Fehlermeldung:

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

Ich bin ein bisschen verloren auf, wie man es repariert. Ich nehme an, dass ich etwas Speicher reservieren muss, machen Sie einen UnsafeMutablePointer dazu und liefern Sie es dann an SecItemCopyMatching?

habe ich versucht, dies:

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

Aber das gab mir ein:

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

jemand eine Idee?

Antwort

26

Es scheint, wir brauchen Unmanaged<> Arbeit nicht mehr.

Versuchen:

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

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

scheint gut zu kompilieren! Kannst du erklären, wie du zu dieser Lösung gekommen bist? Der Compiler will a: UnsafeMutablePointer > noch scheinbar AnyObject? ist auch gut? – Toad

+3

siehe [dieses Dokument] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_16). Wir können einen In-Out-Ausdruck ('&') an den Parameter 'UnsafeMutablePointer 'übergeben. Wenn 'UnsafeMutablePointer >' akzeptiert wird, können wir '& result' übergeben, wenn' result' eine 'Optional ' a.k.a. 'AnyObject?' Variable ist. – rintaro

0

Nach etwas mehr rätselhaft Ich habe mit dieser Lösung kommen:

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) 
    } 

Welche kompiliert. Ich bin mir nicht sicher, ob es tatsächlich noch funktioniert. Wenn dies der Fall ist, werde ich diesen Beitrag aktualisieren. In der Zwischenzeit, wenn Leute, die Bescheid wissen, etwas dazu sagen können, wäre das großartig!