2015-09-03 9 views
6

Abbiamo avuto questo frammento di codice con la versione precedente di Swifterrori di tipo 2.0 portachiavi veloci per 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() 
     } 
    } 

Tuttavia, questo ci dà il seguente errore:

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

Sono un po ' perso su come risolverlo. Suppongo di dover allocare memoria, creare un UnsafeMutablePointer e quindi fornirlo a SecItemCopyMatching?

ho provato questo:

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

Ma questo mi ha dato una:

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

Chiunque un'idea?

risposta

26

Sembra che non ci sia più bisogno di Unmanaged<>.

Prova:

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

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

sembra compilare bene! Puoi spiegare come sei arrivato a questa soluzione? Il compilatore desidera: UnsafeMutablePointer > ancora apparentemente AnyObject? va bene? – Toad

+3

vedere [questo documento] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_16). Possiamo passare l'espressione in-out ('&') al parametro 'UnsafeMutablePointer '. Quando accetta 'UnsafeMutablePointer >', possiamo passare '& result' se' result' è una 'Optional ' a.k.a. 'AnyObject?'. – rintaro

0

Dopo sconcertante ancora un po 'mi è venuta in mente questa soluzione:

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

che compila. Non sono sicuro che funzioni ancora. Se lo faccio aggiornerò questo post. Nel frattempo se le persone che sanno possono commentarlo sarebbe fantastico!

Problemi correlati