【问题标题】:can not add item to NSMutableDictionary in swift iOS无法在 swift iOS 中将项目添加到 NSMutableDictionary
【发布时间】:2014-06-28 14:39:35
【问题描述】:

我想将以下项目添加到 NSMutableDictionary 但我收到以下错误

could not find an overload for setObject that accepts the following arguments


import Security

var returnDictionary = NSMutableDictionary()

returnDictionary.setObject(anObject: kSecClassGenericPassword, forKey: kSecClass)

当我浏览到 security.h 文件时,显示的属性声明如下:

var kSecClass: Unmanaged<AnyObject>!
var kSecClassGenericPassword: Unmanaged<AnyObject>!

【问题讨论】:

  • 您不能使用非托管。您必须立即将其发送至takeRetainedtakeUnretained,然后您才能对其进行任何操作。
  • 我还建议您不要尝试在 Swift 中直接使用 NSMutableDictionary。使用 Swift 字典并在完成后将其传递给 Objective-C。
  • 谢谢马特,我想用这些在钥匙串中设置密码,我假设 kSecClass 应该作为 kSecClassGenericPassword 的密钥传递给 KeyChain?不是这样吗?
  • 好的,我明白你的意思了;您不能使用 AnyObject 作为 Swift 字典中的键。对此感到抱歉。
  • 那么,这是否意味着我必须使用字符串作为 kSecClassGenericPassword 的键?如果我这样做,我还能使用 KeyChain 吗?

标签: ios swift nsmutabledictionary


【解决方案1】:

您必须直接传递字符串,即"class""genp"。你可能想提交一份关于这个的错误报告; Apple 需要在这些常量中提供对 Swift 更友好的桥接。

【讨论】:

  • 谢谢,我猜字符串映射到属性、KSecClass 等,你是如何找出这些属性映射到什么的,例如“class”、“genp”,我可以在某处查找这些吗?
  • 我怕我作弊,直视他们的灵魂。
【解决方案2】:

函数的声明是func setObject(anObject: AnyObject!, forKey aKey: NSCopying!)

在哪里, anObject :对对象的强引用由字典维护。如果 anObject 为 nil,则引发 NSInvalidArgumentException。如果您需要在字典中表示一个 nil 值,请使用 NSNull。

aKey :价值的关键。密钥被复制(使用 copyWithZone:; 密钥必须符合 NSCopying 协议)。如果 aKey 为 nil,则引发 NSInvalidArgumentException。如果 aKey 已经存在于字典中,则 anObject 将取而代之。

在您的情况下 kSecClass 不符合 NSCopying 协议,因此它会给您错误。

尝试使用returnDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword], forKeys: [kSecClass])

下面的代码也应该可以工作Using Swift with Cocoa and Objective-C

var kSecClassSwift: NSString = kSecClass.takeRetainedValue() as NSString
returnDictionary.setObject(accessGroup, forKey: kSecClassSwift)

由于 Xcode 6 beta 中的错误,它现在无法运行,我希望在下一个版本中苹果会修复它。

【讨论】:

  • 给出符合 NSCopying 的密钥,例如:"SecClass" 是符合 NSCopying 的字符串。
  • 我想用这些在钥匙串中设置密码,我假设 kSecClass 应该作为 kSecClassGenericPassword 的密钥传递给 KeyChain?不是这样吗?
  • @Xerxes 试试 returnDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword], forKeys: [kSecClass])
  • 它仅适用于一个元素,但是当我必须根据需要传递多个元素时,它会失败: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword, service, userAccount, dataFromString], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecValueData])
  • 正确声明如下: var keyChain: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword, service, userAccount,dataFromString], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecValueData])
【解决方案3】:

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多