将静态对象数组保存和读取到NSDefaults时出现问题 [英] Trouble Saving and Reading Static Object Array to NSDefaults

查看:39
本文介绍了将静态对象数组保存和读取到NSDefaults时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 //数据处理模型struct EventModel:可编码{让ID:UUID让eventName:字符串让fromTime,toTime:日期让fromTimeString,toTimeString:字符串让颜色:颜色init(id:UUID = .init(),eventName:字符串,fromTime:日期,toTime:日期,fromTimeString:字符串,toTimeString:字符串,颜色:颜色){self.id = idself.eventName = eventNameself.fromTime = fromTimeself.toTime = toTimeself.fromTimeString = fromTimeStringself.toTimeString = toTimeStringself.color =颜色}}struct颜色:可编码{let(r,g,b,a):(CGFloat,CGFloat,CGFloat,CGFloat)var color:UIColor {UIColor.init(red:r,green:g,blue:b,alpha:a)}} 

EventData 类中,我还具有以下 Codable 对象数组:

 //带有EventDataArray的EventData类class EventData:可编码{静态var EventDataArray:[EventModel] = []} 

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

  @IBAction函数保存(_发件人:任意){//初始化对象让currentEvent = EventModel(eventName:文本,fromTime:fromTime,toTime:toTime,fromTimeString:fromTimeString,toTimeString:toTimeString,颜色:convertColor)//附加到数据模型EventData.EventDataArray.append(currentEvent)//写入NSUserDefaults让编码器= JSONEncoder()如果让编码=尝试?encoder.encode(currentEvent){让默认值= UserDefaults.standarddefaults.set(已编码,forKey:"SavedEventData")}} 

这就是我的困惑.如何在保存的数据实例中使用静态数组重新填充数组?

 让默认值= UserDefaults.standard如果让saveEventData = defaults.object(forKey:"SavedEventData")为?数据 {让解码器= JSONDecoder()如果让loadedEventData =试试?coder.decode(EventData.self,来自:savedEventData){//我对在这里做什么感到困惑.}} 

我无法从实例 loadedEventData 调用 EventDataArray ,并且尝试这样做时出现此错误静态成员'EventDataArray'不能用于类型为"EventData"的实例,在此问题上的任何帮助,我们将不胜感激.

解决方案

  struct UserInfo:可编码{变量名称:字符串var emailId:字符串var dob:字符串var city:字串var study:字符串} 

  • 保存数据到 UserDefault

     是否让userInfo =试试?JSONEncoder.encode(self.UserInfo){UserDefaults.standard.set(userInfo,forKey:"UserInfo"")} 

  • UserDefault

  • 检索数据

     是否让retriveData = UserDefaults.standard.object(forKey:" UserInfo")表示为?数据 {如果让userdata =试试?JSONDecoder().decode(UserInfo.self,来自:retriveData){打印(userDetails)}} 

I currently have the following Codabledata structures:

//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,CGFloat)
    var color: UIColor { UIColor.init(red: r, green: g, blue: b, alpha: a) }
}

I also have the following Codable object array in the EventData class:

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

Right now, I have a save button that triggers the following. It creates an instance of the class EventData and saves it to NSUserDefaults. Since the array is static, all instances should (in theory) hold the same values. The parameters I used (text, fromTime, etc.) were declared previously in the @IBAction function and were omitted for brevity.

@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")
            }
}

This is what I'm confused on. How do I repopulate the array using the static array in the saved data instance?

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.
            }
        }

I am unable to call the EventDataArray from the instance loadedEventData, and get this error when trying to do so Static member 'EventDataArray' cannot be used on instance of type 'EventData' I would appreciate any help on this issue.

解决方案

struct UserInfo: Codable {
    var name: String
    var emailId: String
    var dob: String
    var city: String
    var study: String
}

  • save data to UserDefault

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

  • retrive data from UserDefault

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

这篇关于将静态对象数组保存和读取到NSDefaults时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆