web-dev-qa-db-ja.com

Codableを実装するカスタムオブジェクトを保存する方法

Swift 4を使用して、 JSONまたはプロパティリスト との間でエンコード/デコードするのが簡単になりました。

しかし、Objective-CメソッドinitWithCoderencodeWithCoderを使用せずに、Codableを使用してデータにエンコードする方法を見つけることができません。

この単純なクラスを検討します。

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

CodingKeysinitWithCoderではなくencodeWithCoderを使用してデータにエンコードするにはどうすればよいですか?

編集:NSKeyedArchiverを使用して、以前にuserdefaultsに保存されたオブジェクトを逆シリアル化できる必要もあります。

8
Damien

さて、あなたはもはや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)
}
28

Swift 5serDefaultsの優れたシンプルな拡張機能:

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
    }
}

使用法

保存

UserDefaults.standard.save(currentUser, forKey: "currentUser")

get

let user: User? = UserDefaults.standard.getObject(forKey: "currentUser")
3
Musa almatri

それは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)
    }
}
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