ichigoryume programming blog

プログラミングに関する備忘録。主にHTML5, C#, Swiftなど。

クラスインスタンス配列の永続化

概要

  • 自作クラスの配列の保存と読み込みを例にしたサンプルコード

サンプルコード

以下のようなクラスがあったとして

class Person  {
    
    var name:String = ""
    var age:Int = 0

    init(age:Int, name:String) {
        self.age = age
        self.name = name
    }
}

このクラスを永続化するには、NSObjectとNSCodingを継承させ、encode()メソッドと、decodeに相当するinit()メソッドを記述する

class Person : NSObject, NSCoding {
    
    var name:String = ""
    var age:Int = 0

    init(age:Int, name:String) {
        self.age = age
        self.name = name
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.name, forKey: "name")
        aCoder.encode(String(self.age), forKey: "age")
    }
    
    required init?(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObject(forKey: "name") as? String ?? ""
        self.age = Int(aDecoder.decodeObject(forKey: "age") as? String ?? "0") ?? 0
    }
}

ageのようなString以外の型は一旦String型に変換するのがポイント。

このクラスを使った

    var array:Array<Person>

のような配列があるとして、これを保存するには以下のようなコードを書く。

    func save() {
        
        let ret = NSKeyedArchiver.archiveRootObject(array, toFile: getPath())
        if(ret == false) {
            print("save error.")
        }
        else {
            print("save succeeded")
        }
        
    }

    func getPath() -> String {
        let directory = (NSHomeDirectory() as NSString).appendingPathComponent("Documents")
        return (directory as NSString).appendingPathComponent("Persons.dat")
    }

ロードは以下のようなコードを書く。

    let persons = NSKeyedUnarchiver.unarchiveObject(withFile: getPath()) as? Array<Person>