我正在尝试创建一个密钥链查询,但在使用属性项键作为字典键时遇到了困难。在创建字典时,我可以将封装在数组中的属性项作为字典键传递,这样没有任何问题。
genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])但是,如果我试图在查询中添加另一个类似的项,如下所示:
genericPasswordQuery.setObject(accessGroup, key:kSecAttrAccessGroup)它抱怨键不符合NSCopying,并提供了类型错误:
“无法找到接受所提供参数的'setObject‘的重载”
这是SecItemAdd的标准实现,但我在Swift中有问题。
发布于 2014-06-14 20:25:55
我想我想出了解决办法。来自docs
当Swift导入尚未注释的API时,编译器无法自动管理返回的Core对象。Swift将这些返回的对象封装在一个非托管结构中。所有间接返回的对象也都是非管理的。 当从未注释的API接收到非托管对象时,应在使用它之前立即将其转换为内存托管对象。这样,Swift就可以为您处理内存管理。非托管结构提供了将非托管对象转换为内存托管对象的两种方法-takeUnretainedValue()和takeRetainedValue()。
目前的执行情况:
genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])
var kSecAttrAccessGroupSwift: NSString = kSecAttrAccessGroup.takeRetainedValue() as NSString
genericPasswordQuery.setObject(accessGroup, forKey: kSecAttrAccessGroupSwift)这在Xcode中运行良好,但是当我添加.takeRetainedValue时,游乐场会立即崩溃
https://stackoverflow.com/questions/24215757
复制相似问题