在 UserDefaults 中保存自定义对象数组时出现 NSInvalidArgumentException

NSInvalidArgumentException on save an array of custom objects in UserDefaults

我想在我的 UserDefaults 中保存一个对象数组

let thisAction = action(ts: String(Date().timeStamp()), winner: winner)
actions.append(thisAction)
UserDefaults.standard.set(actions, forKey: "currentMatch")
UserDefaults.standard.synchronize()

但是我有以下错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object

尝试 Objective-C 个对象(NSArray、NSDictionary)。
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/UserDefaults/AccessingPreferenceValues/AccessingPreferenceValues.html#//apple_ref/doc/uid/10000059i-CH3-97383.

声明可以保存NSData、NSDate、NSString、NSNumber、NSArray、NSDictionary、NSURL类型的对象,得到。

所以,一个可能的解决方案是:

struct Action { var timestamp: TimeInterval; var winner: String }

var actions: [Action] = []

...
actions.map({ ["time": [=10=].timestamp, "winner": [=10=].winner ] as NSDictionary })
// You could also convert the actions manually one by one into NSDictionary
// and append them to an [NSDictionary]



UserDefaults.standard.set(actions as NSArray, forKey: "currentMatch")
UserDefaults.standard.synchronize()

Swift数组和字典可以分别桥接NSArrayNSDictionary

你也可以使用 Codable,它也可以序列化 属性 个列表。