2016-08-01 9 views
0

Im Rahmen einer Implementierung Swift basierten PKI, portierte ich die SecKeyWrapper.m zu SwiftFehler beim Konvertieren von AnyObject? zu SecKeyRef? in Swift

Sowohl (Objective-C und Swift) der Schlüsselzugriffsmethoden arbeitet gut mit einer Ausnahme an der Swift-Implementierung.

Ich erhalte den öffentlichen Schlüssel vom Peer im Base64-Format. Es ist zu NSData umgewandelt und dann im Schlüsselbund gespeichert werden:

statusCode = SecItemAdd(queryDictionary, &persistentPeer) 

Nach einer erfolgreich verlaufenen Peer öffentlichen Schlüssel im Schlüsselbund speichern, muss ich es als SecKeyRef bekommen.

Das Problem ist, dass SecItemCopyMatching ein Objekt vom Typ AnyObject zurückgibt? zu SecKeyRef gegossen werden (oder SecKey das ist ein Alias) als kann nicht

let key = peerKeyRef as? SecKeyRef // Compile error. 

Die Arbeit rund um Ich fand ist die peerKeyRef als NSObject zu werfen? und dann Objective-C verwenden, um SecKey zu überbrücken, wie folgt:

let keyObject = peerKeyRef as? NSObject 
keyRef = Utility.getSecKeyRefFromAnyObject(keyObject).takeRetainedValue() 

Der Objetive-C-Code zu tun, es ist wie folgt:

+(SecKeyRef) getSecKeyRefFromNSObject:(id)theObject { 
    return (__bridge SecKeyRef)theObject; 
} 

Das Casting zu SecKey diese Abhilfe verwenden funktioniert gut (kein Warnungen oder Fehler) mit dem erwarteten Ergebnis.

Was fehlt Ihrer Meinung nach im Swift-Code, um AnyObject zu übertragen? zu SecKeyRef?

ich mit Xcode arbeite 7.3.1 und Swift 2.2

Rgds ....

Antwort

1

Dieser Fehler kompilieren scheint mir ein Fehler zu sein. (das war einmal eine gültige Diagnose, wenn alle CF-Typen als typealiases von AnyObject importiert wurden.)

Aber in Ihrem Fall würde ich es genauso:

let key = peerKeyRef as! SecKeyRef? 

Sie 100% sicher sind, dass die Abfrage gibt SecKeyRef oder nil zurück, nein?

+0

Hallo @ OOper.let Schlüssel = PeerKeyRef as! SecKeyRef? – eharo2

+0

Sorry ... unvollständiger Kommentar ... Thx @OOper ... Es funktioniert. Aus irgendeinem Grund "PeerKeyRef als? SecKeyRef" fehlschlägt, aber "PeerKeyRef als! SecKeyRef?" funktioniert gut ..... Thx eine Menge ..... – eharo2

+0

@ eharo2, bitte mach dir keine Sorgen, meiner Meinung nach, 'wie?' sollte funktionieren, wo 'wie!' ist gültig. Aber "aus irgendeinem Grund" funktioniert es nicht. Ich habe nicht mit dem neuesten Xcode 8 (Beta 4, wie für jetzt) ​​überprüft, aber wenn Sie das gleiche Verhalten in der neuesten Xcode 8 finden, sollten Sie einen [Bug Report] senden (http://developer.apple.com/bug-mapping /) an Apple. – OOPer

Verwandte Themen