如何保存实现Codable的自定义对象

现在,Swift 4可以更轻松地对JSON或属性列表进行编码/解码。

但我找不到如何使用Codable对Data进行编码,而不使用Objective-C方法initWithCoderencodeWithCoder

考虑这个简单的类:

 struct Question: Codable { var title: String var answer: Int var question: Int } 

如何使用CodingKeys而不是initWithCoderencodeWithCoder其编码为Data?

编辑:我还需要能够使用NSKeyedArchiver反序列化先前保存在userdefaults中的对象。

好吧,你不再需要NSKeyedArchiver

尝试这个:

 let questionObj = Question(title: "WWDC, 2017", answer: 1,question:1) let encoder = JSONEncoder() if let encoded = try? encoder.encode(questionObj) { UserDefaults.standard.set(encoded, forKey: "K_Question") } let decoder = JSONDecoder() if let questionData = UserDefaults.standard.data(forKey: "K_Question"), let question = try? decoder.decode(Question.self, from: questionData) { print(question.title) print(question.answer) print(question.question) } 

那么它可以通过JSONEncoder和JSONDecoder实现。

 struct Question: Codable { var title: String var answer: Int var question: Int } let questionObj = Question(title: "Swift", answer: "Open Source",question:1) let encoder = JSONEncoder() if let encoded = try? encoder.encode(questionObj) { if let json = String(data: encoded, encoding: .utf8) { print(json) } let decoder = JSONDecoder() if let decoded = try? decoder.decode(Question.self, from: encoded) { print(decoded) } }