StructをJSON形式にして保存する


Structをデバイスに恒久的に保存します。
アプリを閉じてもデータは残ります。

手順

1、StructをCodableにして、JSON形式でエンコード、デコードできるようにする。

struct Chocolates: Codable {
    var milk: String = " Mild and sweet. "
    var bitter: String = " Taste for the adult. "
    var white: String = " It's okay once in a while. "

    var numberOfMilk:Int = 0
    var numberOfBitter:Int = 0
    var numberOfWhite:Int = 0

    init(numberOfMilk milk:Int,numberOfBitter bitter:Int,numberOfWhite white:Int){
        self.numberOfMilk = milk
        self.numberOfBitter = bitter
        self.numberOfWhite = white
    } // 初めて作る時用イニシャライザ

// ここから下がJSON形式にエンコード・デコードできるようにする部分

    var json: Data? { // 自身のJSONにエンコードされた形式を返す計算プロパティ
        return try? JSONEncoder().encode(self)
    }

    init?(json: Data) { // 保存されたJSON形式のDataをデコードしてStructを復元するイニシャライザ
        if let newValue = try? JSONDecoder().decode(Chocolates.self, from: json) {
            self = newValue
        } else {
            return nil
        }
    }
}

2、StructのJSONバージョンを作る

var chocolates = Chocolates(numberOfMilk: 3, numberOfBitter: 1, numberOfWhite: 2)
let json = chocolates.json

3、File Managerで書き込み先URLを作って書き込む

guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("chocolates.json") else { return }

do {
    try json.write(to: url)
} catch let error {
    print(error)
}

4、読み出し

guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("chocolates.json") else { return }

 do {
     let jsonData = try Data(contentsOf: url)
     var readChocolates = Chocolates(json: jsonData)
} catch let error {
     print(error)
}

🐣


お仕事のご相談こちらまで
[email protected]

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium