2016-08-01 42 views
0

作爲基於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工作....

回答

1

這編譯錯誤似乎是我的錯誤。 (它曾經當所有CF類型被導入爲AnyObject類型別名有效的診斷。)

但在你的情況我也只是做它:

let key = peerKeyRef as! SecKeyRef? 

您是確保查詢100%返回SecKeyRefnil,否?

+0

Hi @ OOper.let key = peerKeyRef as! SecKeyRef? – eharo2

+0

對不起...評論... Thx @OOper ...它的工作原理。出於某種原因「peerKeyRef as?SecKeyRef」失敗,但「peerKeyRef as!SecKeyRef?」工作正常..... Thx很多..... – eharo2

+0

@ eharo2,請不要擔心,在我看來,'as?'應該在'as!'有效的地方工作。但是,「出於某種原因」,它不起作用。我還沒有檢查過最新的Xcode 8(測試版4,目前爲止),但如果您在最新的Xcode 8中發現相同的行爲,則應發送[Bug Report](http://developer.apple.com)/bug-reporting /)給Apple。 – OOPer

相關問題