2015-09-23 43 views
2

我将NSUserDefault中的UserInfo Dictionary分配为NSMutableDictionary。 现在我的dicInfo是可变字典,但它包含的对象是不可变的。 因此,当我试图替换这些值会导致崩溃。 我附上描述崩溃报告的图像。 如果有任何解决方案,如何将可变字典的内部对象转换为可变。' - [__ NSCFDictionary setObject:forKey:]:发送到不可变对象的变异方法'导致崩溃

由于 enter image description here

+0

安置自己的代码,而不是你的代码的屏幕截图。发布你的例外,而不是你的例外的截图。 – nhgrif

回答

8

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

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

let mutableDictionary = dicInfo?.mutableCopy 

在斯威夫特,我们可能需要施放此为正确的类型:

let mutableDictionary = dicInfo?.mutableCopy as? NSMutableDictionary 
1
var dicInfo = (userSharedDefault.object(forKey: "kUserbasicInfo") as! NSDictionary).mutableCopy() as! NSMutableDictionary 
+2

请提供您的答案解释。 –

0

您还可以创建可变的字典如下: 它将修复崩溃。

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

无论使用斯威夫特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) 
    
相关问题