代码之家  ›  专栏  ›  技术社区  ›  Paul

NSInvalidArgumentException在UserDefault中保存自定义对象数组

  •  0
  • Paul  · 技术社区  · 6 年前

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

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

    但我有以下错误:

    由于未捕获的异常“NSInvalidArgumentException”,正在终止应用程序,原因:“尝试插入非属性列表对象

    1 回复  |  直到 6 年前
        1
  •  0
  •   user9335240    6 年前

    尝试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": $0.timestamp, "winner": $0.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,它还可以序列化属性列表。