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

SwiftSwift

Posted by shi-n