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)でのデータ操作を楽に実装することができました。