我將NSUserDefault中的UserInfo Dictionary分配爲NSMutableDictionary。 現在我的dicInfo是可變字典,但它包含的對象是不可變的。 因此,當我試圖替換這些值會導致崩潰。 我附上描述崩潰報告的圖像。 如果有任何解決方案,如何將可變字典的內部對象轉換爲可變。' - [__ NSCFDictionary setObject:forKey:]:發送到不可變對象的變異方法'導致崩潰
2
A
回答
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
。
千萬不要那樣做。
通常來說,從我這裏批評其他答案,但NSMutableDictionary
和mutableCopy()
確實是在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)
相關問題
- 1. 「 - [__ NSCFDictionary的setObject:forKey:]:變異的方法發送到不可變對象」
- 2. - [__ NSCFDictionary setObject:forKey:]:發送到不可變對象的變異方法
- 3. NSInternalInconsistencyException',原因:' - [__ NSCFDictionary setObject:forKey:]:發送到不可變對象的變異方法
- 4. [__NSCFDictionary setObject:forKey:]:發送到不可變對象的變異方法
- 5. 「 - [__ NSCFDictionary的setObject:forKey:]:變異的方法發送到不可變對象」,呼籲selectRowIndexes時:byExtendingSelection:
- 6. NSMutableArray的NSMutableArray。變異的方法發送到不可變對象
- 7. 應用程序崩潰:將突變方法發送到不可變對象
- 8. NSInternalInconsistencyException變異方法發送到不可變對象在Xcode 6.1
- 9. 發送到不可變對象變異方法 - 錯誤
- 10. NSMutableDictionary錯誤:發送給不可變對象的變異方法
- 11. 發送給不可變對象的變異方法
- 12. 變異方法發送到不可變對象,而對象是Mutiable
- 13. Xcode 8 iOS 10 - NSMutableDictionary引發 - 「發送到不可變對象的變異方法」
- 14. 的NSMutableDictionary崩潰用「發送到不可變對象突變消息」
- 15. 不同誘變方法發送到不可變對象
- 16. 發送到不可變對象的突變方法
- 17. 發送到不可變對象的突變方法
- 18. NSInternalInconsistencyException原因:「 - [__ NSCFArray replaceObjectAtIndex:withObject:]:變異的方法發送到不可變對象」
- 19. 突變方法發送到不可變對象錯誤與mutableCopy()
- 20. 錯誤:replaceObjectAtIndex:withObject:]:突變方法發送到不可變對象
- 21. 如何處理「發送給不可變對象的變異方法」異常?
- 22. Webview對象導致可可崩潰
- 23. 刪除對象時發送到不可變對象的變量方法錯誤
- 24. 如何解決發送給不可變對象的變異方法錯誤
- 25. 獲取「發送給不可變對象的變異方法」錯誤
- 26. 通過Kryonet發送對象導致崩潰
- 27. 線程1:信號SIGABRT突變方法發送到不可變對象'
- 28. 當使用可變數組函數時發送給不可變對象的變異方法錯誤
- 29. 將細胞添加到現有的UICollectionView(將變異方法發送到不可變對象)
- 30. 發送到不可變的對象錯誤
安置自己的代碼,而不是你的代碼的屏幕截圖。發佈你的例外,而不是你的例外的截圖。 – nhgrif