问题描述
我目前拥有以下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) }}