2015-09-23 44 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) 
    
相關問題