独自クラスを作成して、それをNSMutableArrayに格納しているのですが、このNSMutableArray型の変数をシリアライズして、UserDefaultsに保存したいです。(Swift3でコーディングしています)
独自クラスは以下の様に定義しました。
swift
1class DisplayNutritionData :NSObject, NSCoding{ 2 3 // 栄養素名 4 var name :String = "" 5 6 // 表示するかどうか 7 var display :Bool = true 8 9 // 表示内容 10 var value :String = "" 11 12 init(name :String){ 13 self.name = name 14 } 15 16 func encode(with aCoder: NSCoder) { 17 aCoder.encode(name, forKey: "name") 18 aCoder.encode(display, forKey: "display") 19 aCoder.encode(value, forKey: "value") 20 } 21 22 required init?(coder aDecoder: NSCoder) { 23 name = aDecoder.decodeObject(forKey: "name") as! String 24 display = aDecoder.decodeBool(forKey: "display") 25 value = aDecoder.decodeObject(forKey: "value") as! String 26 } 27}
保存処理は次の様に書きました。
swift
1// itemsがNSMutableArray型の変数で、DisplayNutritionDataのインスタンスをいくつか追加してあります。 2let userDefault = UserDefaults.standard 3 let data :Data = NSKeyedArchiver.archivedData(withRootObject: items) as Data 4 userDefault.set(data, forKey: "displayNutrition") 5 userDefault.synchronize()
このコードだと、NSKeyedArchiver.archivedDataを呼んだ時点で落ちてしまいます。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x600000052840'
Arrayに格納してある独自クラスにNSCodingのプロトコルを実装しておけばそれが呼ばれるのだと思ったのですがうまくいきませんでした。
Swift3でコーディングしているのですが、まだネットを探してもあまり情報がなく、困っています。
※Swift3というよりももっと根本的な問題かも知れませんが。。。
以上、よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー