我正在尝试创建一个钥匙串查询,但我在使用属性项键作为字典键方面遇到了困难。在创建字典时,我可以将包含在数组中的属性项作为字典键传递,如此没有任何问题
genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])
但是,如果我尝试将另一个类似的项添加到查询字典中,如下所示:
genericPasswordQuery.setObject(accessGroup, key:kSecAttrAccessGroup)
它抱怨密钥不符合NSCopying并提供类型错误:
"找不到' setObject'接受提供的参数"
这是SecItemAdd的标准实现,但我在Swift中遇到了问题。
答案 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