Swift 使用非托管<;AnyObject>;!作为NSMutableDictionary中的键

Swift 使用非托管<;AnyObject>;!作为NSMutableDictionary中的键,swift,keychain,Swift,Keychain,我试图创建一个keychain查询,但是在使用属性项键作为字典键时遇到了困难。在创建字典时,我可以像这样将包装在数组中的属性项作为字典键传递,而不会出现任何问题 genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric]) 但是,如果我尝试向查询dict添加另一个类似项,如下所示: generic

我试图创建一个keychain查询,但是在使用属性项键作为字典键时遇到了困难。在创建字典时,我可以像这样将包装在数组中的属性项作为字典键传递,而不会出现任何问题

genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])
但是,如果我尝试向查询dict添加另一个类似项,如下所示:

genericPasswordQuery.setObject(accessGroup, key:kSecAttrAccessGroup)
它抱怨密钥不符合NSCopying,并提供类型错误:

“找不到接受所提供参数的'setObject'的重载”


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

我想我找到了解决方案。从:

当Swift导入未注释的API时,编译器 不能自动内存管理返回的核心基础 物体。SWIFT将这些返回的核心基础对象封装在 非托管结构。全部间接返回核心基础 对象也是非托管的

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

目前的执行情况:

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

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

这在Xcode中运行正常,但当我添加时,游乐场立即崩溃。takeRetainedValue是如何定义的?是否需要使用NSMutableDictionary?您的代码也可以与Swift字典一起使用吗?您的优势是您的密钥不需要符合NSCOPY。@Areal-17使用swift字典,我得到错误“无法从字典转换为字典TerralConvertible”