#独自クラスをDATA型にシリアライズまたデシリアライズ,UserDefaultsを用いてデータの永続化を行いたい.
swiftでアプリを作成しています.
上記の目的を達成するためシリアライズ,デシリアライズ,UserDefaultについて調べコードを書いたのですが以下のようなエラーが出てアプリが落ちます.
発生している問題・エラーメッセージ
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'root' was of unexpected class 'NSArray'. Allowed classes are '{(Remind_Calendar.MyTodo)}'." UserInfo={NSDebugDescription=value for key 'root' was of unexpected class 'NSArray'. Allowed classes are '{(Remind_Calendar.MyTodo)}'.}
###エラー和訳
致命的なエラー:「試してください」 Error Domain = NSCocoaErrorDomain Code = 4864 "キー 'root'の値は予期しないクラス 'NSArray'です。許可されたクラスは '{(Remind_Calendar.MyTodo"UserInfo = {NSDebugDescription =キー 'root'の値は予期しないクラス 'NSArray'です。許可されたクラスは '{(Remind_Calendar.MyTodo)}。
##独自クラスの定義(swift)
swift
1class MyTodo: NSObject, NSCoding { 2 3 var todoTitle: String? 4 var todoDone: Bool = false 5 6 override init() {} 7 8 required init?(coder aDecoder: NSCoder) { 9 todoTitle = aDecoder.decodeObject(forKey: "todoTitle") as? String 10 todoDone = aDecoder.decodeBool(forKey: "todoDone") 11 } 12 13 func encode(with aCoder: NSCoder) { 14 aCoder.encode(todoTitle, forKey: "todoTitle") 15 aCoder.encode(todoDone, forKey: "todoDone") 16 } 17}
##実装部分
swift
1//独自クラスのインスタンス 2var todoList = [MyTodo]() 3 4//処理 5 6//独自クラスをシリアライズしてUserDefaultsに保存 7let userDefaults = UserDefaults.standard 8 let data = try? NSKeyedArchiver.archivedData(withRootObject: self.todoList, requiringSecureCoding: false) 9 userDefaults.set(data, forKey: "todoList") 10 userDefaults.synchronize() 11 12//処理 13 14//UserDefaultsのデータをデシリアライズ 15let userDefaults = UserDefaults.standard 16 if let savedTodoList = userDefaults.object(forKey: "todoList") as? Data { 17 if let unachiveTodoList = try! NSKeyedUnarchiver.unarchivedObject(ofClass: MyTodo.self, from: savedTodoList){ 18 //処理 19 } 20 }
###試したこと
エラーが出ているのは画面が出た時最初に行うデシリアライズ処理であると考えたのでデシリアライズ処理について調べました.
ios12からデシリアライズのunarchivedObject(with:)メソッドが使えなくなり,unarchivedObject(ofClass:from:)メソッドかunarchivedObject(ofClasses:from:)メソッドを用いなければならなくなった?とあったのでこの辺りを調べ試したがうまくいきませんでした.
回答3件
あなたの回答
tips
プレビュー