🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

1回答

834閲覧

Swiftで、カスタムクラスをuserDefaultsで保存したい

Yuto409

総合スコア3

Swift

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

0グッド

0クリップ

投稿2021/02/19 12:32

前提・実現したいこと

次のコードの、listsをUserDefaultsで保存したいのですが、クラス内のクラスの配列の扱い方がわかりません。

該当のソースコード

Swift

1import Foundation 2import UIKit 3 4class Task: Identifiable, Codable { 5 var id: UUID 6 var taskName: String 7 var isCompleted: Bool 8 var flag: Bool 9 var date: Date? 10 11 init(id: UUID, taskName: String, idCompleted: Bool, flag: Bool, date: Date?) { 12 self.taskName = taskName 13 self.id = id 14 self.isCompleted = idCompleted 15 self.flag = flag 16 self.date = date 17 } 18} 19 20class TaskList: NSObject, Codable { 21 var title: String 22 var tasks: [Task] 23 24 init(title: String, tasks: [Task]) { 25 self.title = title 26 self.tasks = tasks 27 } 28} 29 30 31 32var lists = [TaskList(title: "やること", tasks: [Task]()), 33 TaskList(title: "買い物", tasks: [Task]() )] 34

また、読み出す時はTableViewに表示したいです。

import Foundation import UIKit class HomeView: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { lists.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell", for: indexPath) cell.textLabel!.text = lists[indexPath.row].title return cell }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここに時折出没される MasakiHori さんの

をそのまま使えると思います。

保存時は

Swift

1UserDefaults.standard.setEncoded(lists, forKey: "test")

ロード時は

Swift

1let lists = UserDefaults.standard.decodedObject([TaskList].self, forKey: "test")

みたいな感じです。
ただし、ロード時にエラーが発生した場合には nil が戻ることに注意をお願いします。

setter, getter を使って

Swift

1var list: [TaskList] { 2 set { 3 UserDefaults.standard.setEncoded(newValue, forKey: "test") 4 } 5 6 get { 7 // キーが存在しない時など、エラー時には nil になるので、適切な処理が必要。 8 // この場合は、nil 合体演算子を使って nil の代わりに空配列を返している 9 UserDefaults.standard.decodedObject([TaskList].self, forKey: "test") ?? [] 10 } 11}

みたいな使い方もあるかと思います。

投稿2021/02/19 14:24

TsukubaDepot

総合スコア5086

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

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

Yuto409

2021/02/19 14:49

数日間苦戦していましたが、一発で解決できてしまいました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問