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

Dam*_*ien 8 ios swift swift4

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

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

考虑这个简单的类:

struct Question: Codable {
    var title: String
    var answer: Int
    var question: Int
}
Run Code Online (Sandbox Code Playgroud)

我怎么能对数据进行编码来使用CodingKeys,而不是initWithCoderencodeWithCoder

编辑:我还需要能够使用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)

  • 谢谢!那么这意味着我们可以使用 JSONEncoder 和 PropertyListEncoder 吗?知道哪个更快吗? (2认同)

Mus*_*tri 6

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)


ank*_*kit 0

可以通过 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)