' - [__ NSCFDictionary setObject:forKey:]:发送到不可变对象的mutating方法'导致崩溃

时间:2015-09-23 12:23:28

标签: swift

我将NSUserDefault的UserInfo Dictionary指定为NSMutableDictionary。 现在我的dicInfo是可变字典,但它包含的对象是不可变的。 因此,当我试图替换这些值时,它会导致崩溃。 我附上描述崩溃报告的图像。 如果有任何解决方案,如何将可变字典的内部对象转换为可变字典。

由于 enter image description here

4 个答案:

答案 0 :(得分:9)

NSDictionary类符合NSMutableCopying协议。因此,我们可以在mutableCopy上调用NSDictionary方法来获取对象的NSMutableDictionary副本。

let dicInfo = userSharedDefaults?.objectForKey(UserDefaultKey.kUserBasicInfo) as? NSDictionary

let mutableDictionary = dicInfo?.mutableCopy

在Swift中,我们可能需要将其转换为正确的类型:

let mutableDictionary = dicInfo?.mutableCopy as? NSMutableDictionary

答案 1 :(得分:1)

const emailModule = require('myModuleName');

emailModule.sendMail('some@mail.com', output).then(() => {
  //whatever
}).catch(catchErrFn)

答案 2 :(得分:0)

您还可以按如下方式创建Mutable Dictionary: 它将解决崩溃问题。

let dicInfo = NSMutableDictionary.init(dictionary: userSharedDefaults?.objectForKey(UserDefaultKey.kUserBasicInfo) as! NSDictionary)

答案 3 :(得分:0)

在Swift中既不使用NSMutableDictionary也不使用mutableCopy()来从UserDefaults获取可变字典。

从不这样做

通常情况下,我批评其他答案,但NSMutableDictionarymutableCopy()确实是Swift中不恰当的API。

  • 要从UserDefaults获取字典,请使用专用方法dictionary(forKey:。默认字典类型为[String:Any]
  • 要使对象变为可变,只需使用var关键字

    即可
    var userbasicInfo : [String:Any]
    if let dictionary = UserDefaults.standard.dictionary(forKey: UserDefaultKey.kUserBasicInfo) {
        userbasicInfo = dictionary
    } else {
        userbasicInfo = [String:Any]()
    }
    userbasicInfo[kPin] = 5678
    print(userbasicInfo)
    UserDefaults.standard.set(userbasicInfo, forKey:UserDefaultKey.kUserBasicInfo)