2016-08-01 13 views
0

にスイフトベースPKI実装の一部として、私は、スイフト実装における一部を除いて正常に動作しているキーチェーンアクセス方法のスイフトAnyObjectからのキャストエラー? SecKeyRefに?スイフト

両方、(対物-CおよびSWIFT)にSecKeyWrapper.mを移植しました。

ピアから公開鍵をbase64形式で受け取ります。これはNSDataのに変換してから使用してキーチェーンに保存されます。

statusCode = SecItemAdd(queryDictionary, &persistentPeer) 

首尾キーチェーンにピアの公開鍵を保存した後、私はSecKeyRefとしてそれを取得する必要があります。

queryDictionary[kSecReturnPersistentRef] = true 
    var peerKeyRef: AnyObject? 
    statusCode = SecItemCopyMatching(queryDictionary, &peerKeyRef) 

問題は、SecItemCopyMatchingはAnyObject型のオブジェクトを返しますか?仕事は私の周りに

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

SecKeyRefにキャスト(またはSecKeyのザッツは別名である)ことがcan'tより見つけNSObjectのようpeerKeyRefをキャストするのですか?その後、次のようにSecKeyに橋渡しするのObjective-Cを使用します。

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

それを行うにはObjetive-Cのコードを次のとおりです。この回避策を使用してSecKeyに鋳造が正常に動作します

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

(なし警告またはエラー)を予期した結果と比較します。

AnyObjectをキャストするSwiftコードには何がないと思いますか? SecKeyRefに?私はXcodeの7.3.1とスウィフト2.2

RGDS ....

答えて

1

コンパイルエラーで働いています

は私にはバグのようです。

(一度すべてのCFタイプがAnyObjectのtypealiasesとして輸入された有効な診断でした。)しかし、あなたの場合には、私はちょうどとしてそれを行うだろう:

let key = peerKeyRef as! SecKeyRef? 

あなたは、クエリその100%確信していますSecKeyRefまたはnilを返しますか?

+0

こんにちは@ OOper.letキー= peerKeyRefとして! SecKeyRef? – eharo2

+0

申し訳ありません...不完全なコメント... Thx @Oper ...それは動作します。何らかの理由で "peerKeyRef as?SecKeyRef"が失敗しますが、 "peerKeyRef as!SecKeyRef?"うまく動作します..... Thxたくさん..... – eharo2

+0

@ eharo2、心配しないでください、私の意見では、 'as? 'は' as!'が有効な場所で動作するはずです。しかし、 "何らかの理由で"、それは動作していません。私は最新のXcode 8(ベータ4)をチェックしていませんが、最新のXcode 8で同じ動作が見つかった場合は、[Bug Report](http://developer.apple.com/bug-report /)をアップルに提出してください。 – OOPer

関連する問題