Swift classインスタンス配列をファイルエクスポート・インポート
class
class PageData: NSObject, NSCoding { var year: Int var week: Int var data: Data init(year: Int, week:Int, data: Data) { self.year = year self.week = week self.data = data } func encode(with coder: NSCoder) { coder.encode(year, forKey: "year") coder.encode(week, forKey: "week") coder.encode(data, forKey: "data") } required init?(coder: NSCoder) { self.year = coder.decodeInteger(forKey: "year") self.week = coder.decodeInteger(forKey: "week") self.data = coder.decodeObject(forKey: "data") as? Data ?? Data() } }
- NSObject(class)を継承
- NSCoding(protocol)を適用
- デコード(ファイルからclass)用にrequired init?(coder: NSCoder)実装
- エンコード(classからファイル)用にfunc encode(with coder: NSCoder)実装
私が嵌った所
self.year = coder.decodeInteger(forKey: “year")を
self.year = coder.decodeObject(forKey: “year") as? Int ?? -1
とコーディングしてデコードされなかった
ファイルエクスポート
var pageDatas: [PageData] = ★クラスインスタンの配列★ let documentsFileName = ★ファイルパス★ let url = URL(fileURLWithPath: documentsFileName) let data = NSKeyedArchiver.archivedData(withRootObject: pageDatas) do { try data.write(to: url!) } catch { print(error.localizedDescription) }
- NSKeyedArchiverのメソッドを使用してclassからDataに変換
- Dataのwriteメソッドでファイル出力
ファイルインポート
let url: URL = ★ファイルパス★ var pageDatas: [PageData] = [] do { let readData = try Data(contentsOf: url) pageDatas = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(readData) as! [PageData] } catch { print(error.localizedDescription) }
- Dataのinitでファイル入力
- NSKeyedUnarchiverのメソッドを使用してDataからclassに変換