将静态对象数组保存和读取到 NSDefaults 时遇到问题

问题描述

我目前拥有以下Codable数据结构:

//Models for Data Handling
struct EventModel: Codable {
    let id: UUID
    let eventName: String
    let fromTime,toTime: Date
    let fromTimeString,toTimeString: String
    let color: Color
    init(id: UUID = .init(),eventName: String,fromTime: Date,toTime: Date,fromTimeString: String,toTimeString: String,color: Color) {
        self.id = id
        self.eventName = eventName
        self.fromTime = fromTime
        self.toTime = toTime
        self.fromTimeString = fromTimeString
        self.toTimeString = toTimeString
        self.color = color
    }
}

struct Color: Codable {
    let (r,g,b,a): (CGFloat,CGFloat,CGFloat)
    var color: UIColor { UIColor.init(red: r,green: g,blue: b,alpha: a) }
}

我在 Codable 类中还​​有以下 EventData 对象数组:

//EventData class with EventDataArray
class EventData: Codable {
    
    static var EventDataArray: [EventModel] = []
    
}

现在,我有一个可触发以下操作的保存按钮。它创建类 EventData 的实例并将其保存到 NSUserDefaults。由于数组是静态的,所有实例都应该(理论上)保持相同的值。我使用的参数(text、fromTime 等)之前已在 @IBAction 函数中声明,为简洁起见省略。

@IBAction func save(_ sender: Any) {

            //initialize object
            let currentEvent = EventModel(eventName: text,fromTime: fromTime,toTime: toTime,fromTimeString: fromTimeString,toTimeString: toTimeString,color: convertedColor)
        
            //append to data model
            EventData.EventDataArray.append(currentEvent)
            
            //write to NSUserDefaults
            let encoder = JSONEncoder()
            if let encoded = try? encoder.encode(currentEvent) {
                let defaults = UserDefaults.standard
                defaults.set(encoded,forKey: "SavedEventData")
            }
}

这是我困惑的地方。如何使用已保存数据实例中的静态数组重新填充数组

let defaults = UserDefaults.standard
        if let savedEventData = defaults.object(forKey: "SavedEventData") as? Data {
            let decoder = JSONDecoder()
            if let loadedEventData = try? decoder.decode(EventData.self,from: savedEventData) {
            //I'm confused on what to do here.
            }
        }

我无法从实例 EventDataArray 调用 loadedEventData,并且在尝试执行此操作时遇到此错误 Static member 'EventDataArray' cannot be used on instance of type 'EventData' 我将不胜感激对此问题的任何帮助。

解决方法

Data Save:
    var userDefaults = UserDefaults.standard
    let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: 
    EventDataArray)
    userDefaults.set(encodedData,forKey: "EventDataArray")
    userDefaults.synchronize()

Data Read:
    let decoded  = userDefaults.data(forKey: "EventDataArray")
    let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) 
    as! [EventDataArray]

您可以通过此链接获得更多答案Save custom objects into NSUserDefaults

,
struct UserInfo: Codable {
    var name: String
    var emailId: String
    var dob: String
    var city: String
    var study: String
}
  • 保存数据到UserDefault

    if let userInfo = try? JSONEncoder.encode(self.UserInfo) {
      UserDefaults.standard.set(userInfo,forKey: "UserInfo")  }
    
  • UserDefault

    检索数据
     if let retriveData = UserDefaults.standard.object(forKey: "UserInfo") as? Data {
     if let userdata = try? JSONDecoder().decode(UserInfo.self,from: retriveData) {
         print(userDetails)
     }}