使用非托管<anyobject>!作为NSMutableDictionary </anyobject>的关键

时间:2014-06-14 01:20:21

标签: swift keychain

我正在尝试创建一个钥匙串查询,但我在使用属性项键作为字典键方面遇到了困难。在创建字典时,我可以将包含在数组中的属性项作为字典键传递,如此没有任何问题

genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])

但是,如果我尝试将另一个类似的项添加到查询字典中,如下所示:

genericPasswordQuery.setObject(accessGroup, key:kSecAttrAccessGroup)

它抱怨密钥不符合NSCopying并提供类型错误:

&#34;找不到&#39; setObject&#39;接受提供的参数&#34;

这是SecItemAdd的标准实现,但我在Swift中遇到了问题。

1 个答案:

答案 0 :(得分:8)

我想我找到了一个解决方案。来自docs

  

当Swift导入尚未注释的API时,编译器   无法自动内存管理返回的Core Foundation   对象。 Swift将这些返回的Core Foundation对象包装在一个   不受管理的结构。所有间接归还核心基金会   对象也是不受管理的。

     

当您从未注释的API收到非托管对象时,您   应该立即将它转换为内存管理对象   与它合作。这样,Swift可以为您处理内存管理。   Unmanaged结构提供了两种转换方法   非托管对象到内存管理对象 - takeUnretainedValue()和   takeRetainedValue()。

目前的实施:

genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])

var kSecAttrAccessGroupSwift: NSString = kSecAttrAccessGroup.takeRetainedValue() as NSString
genericPasswordQuery.setObject(accessGroup, forKey: kSecAttrAccessGroupSwift)

这在Xcode中运行良好,但是当我添加时,Playground会立即崩溃.takeRetainedValue