我想将自定义Note()类的数组转换为Data(),以便以后对其进行加密并存储。
我的课是
class Note: NSObject {
var text = "hi"
var date = Date()
}
上面的类是一个示例。我的课会更复杂。
我尝试过
let plistData = NSKeyedArchiver.archivedData(withRootObject: mergedNotes)
if let a: Array<Note> = NSKeyedUnarchiver.unarchiveObject(with: plistData) as? Array<Note> {
print(a)
}
以上代码因信号异常而崩溃。
这是如何工作的,并且不对整个类进行解码就可以实现吗?
答案 0 :(得分:0)
首先设置您的Note类,必须符合可编码协议:
class Note: Codable {
var text = "hi"
var date = Date()
init(t: String, d: Date) {
text = t
date = d
}
enum CodingKeys: String, CodingKey {
case text
case date
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
text = try container.decode(String.self, forKey: .text)
date = try container.decode(Date.self, forKey: .date)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(text, forKey: .text)
try container.encode(date, forKey: .date)
}
}
然后您可以创建一系列笔记:
let arrayOfNotes: [Note] = [Note(t: "someNote", d: Date())]
并将其保存为用户默认设置:
do {
let encoded = try JSONEncoder().encode(arrayOfNotes)
UserDefaults.standard.set(encoded, forKey: "SavedNotes")
} catch let error {
// catch any error if present
print(error)
}
要检索已保存的数据,您可以简单地使用if let或do-catch,如上:
if let savedData = UserDefaults.standard.value(forKey: "SavedNotes") as? Data {
if let notes = try? JSONDecoder().decode(Note.self, from: savedData) {
// do whatever you need
}
}