web-dev-qa-db-fra.com

Comment enregistrer des objets personnalisés qui implémentent Codable

Il est maintenant plus facile avec Swift 4 d'encoder/décoder vers/depuis JSON ou la liste des propriétés .

Mais je ne trouve pas comment encoder des données avec Codable sans utiliser les méthodes Objective-C initWithCoder et encodeWithCoder.

Considérant cette classe simple:

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

Comment puis-je l'encoder en données en utilisant CodingKeys et non pas initWithCoder et encodeWithCoder?

EDIT: Je dois également pouvoir désérialiser les objets précédemment enregistrés dans les paramètres utilisateur par défaut à l’aide de NSKeyedArchiver.

8
Damien

Eh bien, vous n’avez plus besoin de NSKeyedArchiver.

Essaye ça:

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)
}
25
LC 웃

Eh bien, cela peut être réalisé via JSONEncoder et 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)
    }
}
0
ankit
struct Question: Codable {
    var title: String
    var answer: Int
    var question: Int
}

class UserDefaults_Question {
    static let key = "myapp.trick.question"

    static var value: UserDefaults_Question? {
        get {
            guard let data = UserDefaults.standard.data(forKey: key) else {
                print("no model for key: \(key)")
                return nil
            }
            guard let model = try? JSONDecoder().decode(UserDefaults_Question.self, from: data) else {
                print("failed to decode model for key: \(key)")
                return nil
            }
            print("did load model for key: \(key)")
            return model
        }
        set {
            guard let value = newValue, let data: Data = try? JSONEncoder().encode(value) else {
                print("removing model for key: \(key)")
                UserDefaults.standard.removeObject(forKey: key)
                return
            }
            print("inserting model for key: \(key)")
            UserDefaults.standard.set(data, forKey: key)
        }
    }
}

UserDefaults_Question.value = Question(title: "Next President", answer: 666, question: -1)
0
neoneye