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に変換






