作爲基於PKI斯威夫特實現的一部分,我移植的SecKeyWrapper.m到的鑰匙扣訪問方法夫特從AnyObject轉換錯誤?到SecKeyRef?在夫特
兩者,(Objective-C和SWIFT)除了在迅速執行一個部分都工作正常。
我以base64格式從對等端接收公鑰。它轉換爲NSData的,然後使用保存在Keychain:
statusCode = SecItemAdd(queryDictionary, &persistentPeer)
成功後保存對公共密鑰在鑰匙串,我需要把它作爲SecKeyRef。
queryDictionary[kSecReturnPersistentRef] = true
var peerKeyRef: AnyObject?
statusCode = SecItemCopyMatching(queryDictionary, &peerKeyRef)
問題是,SecItemCopyMatching返回一個AnyObject類型的對象?比不容被鑄造到SecKeyRef(或SecKey這就是一個別名)
let key = peerKeyRef as? SecKeyRef // Compile error.
左右,我發現這項工作是投peerKeyRef作爲NSObject的?然後用Objective-C的橋接到SecKey如下:
let keyObject = peerKeyRef as? NSObject
keyRef = Utility.getSecKeyRefFromAnyObject(keyObject).takeRetainedValue()
的Objetive-C代碼來做到這一點是如下:
+(SecKeyRef) getSecKeyRefFromNSObject:(id)theObject {
return (__bridge SecKeyRef)theObject;
}
使用此解決方法SecKey的鑄造工作正常(無警告或錯誤)與預期的結果。
你認爲在Swift代碼中丟失了什麼來投射AnyObject?到SecKeyRef?
我在Xcode 7.3.1和2.2雨燕
RGDS工作....
Hi @ OOper.let key = peerKeyRef as! SecKeyRef? – eharo2
對不起...評論... Thx @OOper ...它的工作原理。出於某種原因「peerKeyRef as?SecKeyRef」失敗,但「peerKeyRef as!SecKeyRef?」工作正常..... Thx很多..... – eharo2
@ eharo2,請不要擔心,在我看來,'as?'應該在'as!'有效的地方工作。但是,「出於某種原因」,它不起作用。我還沒有檢查過最新的Xcode 8(測試版4,目前爲止),但如果您在最新的Xcode 8中發現相同的行爲,則應發送[Bug Report](http://developer.apple.com)/bug-reporting /)給Apple。 – OOPer