现在,Swift 4可以更轻松地对JSON或属性列表进行编码/解码.
但是我找不到如何使用Codable对Data进行编码,而不使用Objective-C方法initWithCoder和encodeWithCoder.
考虑这个简单的类:
struct Question: Codable {
var title: String
var answer: Int
var question: Int
}
Run Code Online (Sandbox Code Playgroud)
我怎么能对数据进行编码来使用CodingKeys,而不是initWithCoder和encodeWithCoder?
编辑:我还需要能够使用NSKeyedArchiver反序列化以前保存在userdefaults中的对象.
LC *_*C 웃 28
好吧,你不再需要了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)
}
Run Code Online (Sandbox Code Playgroud)
Swift 5 : UserDefaults 的一个很棒的简单扩展:
extension UserDefaults {
func save<T: Codable>(_ object: T, forKey key: String) {
let encoder = JSONEncoder()
if let encodedObject = try? encoder.encode(object) {
UserDefaults.standard.set(encodedObject, forKey: key)
UserDefaults.standard.synchronize()
}
}
func getObject<T: Codable>(forKey key: String) -> T? {
if let object = UserDefaults.standard.object(forKey: key) as? Data {
let decoder = JSONDecoder()
if let decodedObject = try? decoder.decode(T.self, from: object) {
return decodedObject
}
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
用法
节省
UserDefaults.standard.save(currentUser, forKey: "currentUser")
Run Code Online (Sandbox Code Playgroud)
得到
let user: User? = UserDefaults.standard.getObject(forKey: "currentUser")
Run Code Online (Sandbox Code Playgroud)
可以通过 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)
}
}
Run Code Online (Sandbox Code Playgroud)