LoginSignup
1
3

More than 3 years have passed since last update.

SwiftでProperty List(.plist)への書き込みと読み込みを実装する

Last updated at Posted at 2020-10-14

Property List(.plistファイル)へのデータ書き込みとデータ読み込みを、PropertyListEncoder(Decoder)Codableに準拠したモデルを利用して行います。

前提

Swift: 5.0

実装

モデルの用意

Property Listに保存したいデータのモデルを、Codableに準拠する形で作成します。
今回は例として、タイトルと著者名を要素に持つBookをモデルとします。

Book.swift
struct Book: Codable {
    var title: String
    var writerName: String
}

データの書き込み

ファイル操作はFileManagerを用いて行います。
先程用意したモデルを、PropertyListEncoderを使ってエンコードすることで、Property Listへの書き込みが行えます。

BookManager.swift
class BookManager {
    // 扱うProperty ListのURL Path
    static private var plistURL: URL {
        let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        return documents.appendingPathComponent("book.plist")
    }

    static func write(book: Book) {
        let encoder = PropertyListEncoder()
        // 保存したいデータをエンコード
        guard let data = try? encoder.encode(book) else { return }
        // すでにProperty Listが存在する場合は上書き。そうでない場合は新しく作成
        if FileManager.default.fileExists(atPath: plistURL.path) {
            try? data.write(to: plistURL)
        } else {
            FileManager.default.createFile(atPath: plistURL.path, contents: data, attributes: nil)
        }
    }
}

データの読み込み

データの書き込みと同様に、ファイル操作はFileManagerを用いて行います。
PropertyListDecoderを用いてProperty Listから読み込んだデータをBookモデルにデコードしています。

BookManager.swift
class BookManager {
    // 省略 //

    static func load() -> Book {
        let decoder = PropertyListDecoder()
        // 保存先のProperty Listからデータを読み込んでデコード
        guard let data = try? Data.init(contentsOf: plistURL), 
              let book = try? decoder.decode(Book.self, from: data) else { 
              return Book(title: "", writerName: "")
        }
        return book
    }
}

終わりに

Codable及びPropertyListEncoder(Decoder)を使うことで、Property List(.plist)でのデータ操作を楽に実装することができました。

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3