質問: readimage() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } ``` ### 試したこと ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: 問題はいくつかあります。 * UserDefaultsにはUIImageは保存できない * UserDefaultsは画像みたいな大きなデータを保存するのは向かない * 提示されているエラーメッセージはUserDefaultsとは関係ない 一つ一つ解説します。 ### UserDefaultsにはUIImageは保存できない UserDefaultsに保存できるデータの型は決まっています。 詳しくはリファレンスを見て欲しいですが、少なくともUIImageは保存できません。 UIImageを保存しようとするならば、Data型に変換すればいいでしょう。 ``` let pngImageData: Data? = UIImagePNGRepresentation(image) ``` ### UserDefaultsは画像みたいな大きなデータを保存するのは向かない pngImageDataをUserDefaultsに渡せば保存することはできると思います。 ですが画像はデータサイズが大きいので通常はUserDefaultsには保存しません。自分は体験したことないですが、大きいデータを保存しすぎるとアプリの起動に時間がかかるようになるそうです。 なのでファイルやデータベースに保存するのが多いと思います。 とりあえずDocumentsディレクトリにファイルとして保存するには以下のようにします。 ``` let documentsURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let fileURL: URL = documentsURL.appendingPathComponent("image.png") do { try pngImageData!.write(to: fileURL) } catch let e { print("画像書き込み失敗:", e) } ``` ### 提示されているエラーメッセージはUserDefaultsとは関係ない これで画像をファイルとして永続化できると思うのですが、そもそも質問に貼ってもらってあるエラーメッセージを見るにそれ以外の部分でクラッシュしているように思います。 なのでどこでエラーが発生しているかを提示していただかないとわかりません。 と、いうことでfuzzballさんの質問への追記修正依頼に答えてもらわないと回答できません。