在 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数组和字典可以分别桥接到NSArray
、NSDictionary
。
你也可以使用 Codable,它也可以序列化 属性 个列表。
我想在我的 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数组和字典可以分别桥接到NSArray
、NSDictionary
。
你也可以使用 Codable,它也可以序列化 属性 个列表。