質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

4357閲覧

swift 独自クラスの"unarchivedObject"

sahara_007

総合スコア15

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/02/13 09:58

#独自クラスを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:)メソッドを用いなければならなくなった?とあったのでこの辺りを調べ試したがうまくいきませんでした.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/02/14 00:26

もう少しエラーメッセージを吟味してみてはどうでしょうか?
sahara_007

2019/02/14 07:08

アドバイスいただきありがとうございます. わかりました,エラーメッセージの内容をより詳しく見て見ます.
guest

回答3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず以下が動いたコードです。

swift:

1if let unachiveTodoList = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [MyTodo] { 2 ... 3}

投稿2019/02/14 00:41

編集2019/02/14 00:59
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sahara_007

2019/02/14 07:06

ありがとうございます. 参考になりました!
guest

0

修正

let unachiveTodoList = try! NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: savedTodoList) as? [MyTodo] {

です。


以下、間違い

型の指定のところ MyTodo.selfじゃなくて [MyTodo].self です。
保存されてるのは配列だからね。

投稿2019/02/14 01:42

編集2019/02/14 03:20
MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/02/14 01:54

私も最初それで回答していたのですが、動かしてみるとincorrect argument label in call (have 'ofClass:from:', expected 'ofClasses:from:') ってエラーが出ちゃうんですよね。
MasakiHori

2019/02/14 03:19

なるほど、条件付きジェネリクスになってますね。
sahara_007

2019/02/14 06:55

回答ありがとうございます, 私もそのあたりはいくつか試して見たのですが同じようにエラーが消えませんでした. 条件付きジェネリクスについてももう少し調べて分析してみようと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問