2016-08-01 40 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

相关问题