将 [Int:String] 字典存储到 user.defaults 会因 SIGABRT 错误而崩溃

Posted

技术标签:

【中文标题】将 [Int:String] 字典存储到 user.defaults 会因 SIGABRT 错误而崩溃【英文标题】:storing [Int:String] dictionaries to user.defaults crashes with SIGABRT error 【发布时间】:2018-08-22 06:42:26 【问题描述】:

使用 user.default 保存一堆数据。除了一本字典 [Int:String] 之外,一切都很好。有趣的是,我可以很好地保存字典 [String:Int],但是一旦它的 [Int:String],当我运行包含我的代码的保存函数时它就会崩溃。

控制台显示如下:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试插入非属性列表对象 99 = 詹妮弗; 代表关键球员的名字

谢谢

【问题讨论】:

【参考方案1】:

您尝试保存在 UserDefualt 中的对象必须是 NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary 类型。根据苹果文档:

默认对象必须是一个属性列表,即(或 对于集合,NSData、NSString 的实例的组合, NSNumber、NSDate、NSArray 或 NSDictionary。如果你想存储任何 其他类型的对象,您通常应该将其归档以创建一个 NSData 的实例。 UserDefault Documentation

NSDictionary 的key 是一个字符串或者一个符合NSCopying 协议的类型。

你可以试试这个:

let yourData = NSKeyedArchiver.archivedDataWithRootObject(yourDictionary)
let userDefualts = UserDefaults.standard
userDefualts.set(yourData, forKey: "yourKey")

【讨论】:

欣赏,非常感谢。完美地工作。对于那些看到这一点的人,要取消归档你已经取得的成果,请使用以下 swift 4: NSKeyedUnarchiver.unarchiveObject(with: Data)

以上是关于将 [Int:String] 字典存储到 user.defaults 会因 SIGABRT 错误而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

将对象数组映射到 Swift 中的字典

2021-11-24 WinFrom面试题 如何将Dictionary<int,string>中存储的信息绑定到ListBox中?

如何在实例化时将值插入 C# 字典?

如何使用 LINQ 过滤字典并将其返回到相同类型的字典

在 C# 中的字典 <int, string> 中添加所有键

如何在Swift 5中对[int:String]的字典进行排序[重复]