回答編集履歴

1 セルデータの扱いについて追記

TsukubaDepot

TsukubaDepot score 5037

2020/04/06 09:41  投稿

`[String]`型の`UserDefaults`を使った保存と呼び出しはこんな感じになります。
```Swift
import Foundation
let todos = ["食う", "寝る", "遊ぶ"]
// 保存
UserDefaults.standard.set(todos, forKey: "todo")
// 読み込み
if let getData = UserDefaults.standard.stringArray(forKey: "todo") {
   print(getData)
} else {
   print("error")
}
// object(forKey:)でも取得できるが、型変換が必要
if let getData = UserDefaults.standard.object(forKey: "todo") as? [String] {
   print(getData)
} else {
   print("error")
}
```
適切な場所で保存し、適切な場所で読み出せばいいかと思います。
上記のサンプルはPlaygroundでも動くので、まずは簡単なサンプルを作り動かしてみることで動作を確認されてはいかがでしょうか。
上記のサンプルはPlaygroundでも動くので、まずは簡単なサンプルを作り動かしてみることで動作を確認されてはいかがでしょうか。
--
ToDo のデータを保存したいということであれば、Cell に保存するというか、1件のToDoに対応するクラスを作り、それを配列にして扱った方が簡単です。
たとえば、
```Swift
class Todo {
   var title: String
   var todoDescription: String
   init(title: String, description: String = "") {
       self.title = title
       self.todoDescription = description
   }
}
```
のような感じでクラスを作り、適切なところで
```Swift
var todoArray: [Todo] = []
````
といった感じでTodoクラスの配列を作り、
```Swift
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       // 主要なところのみ掲載
       let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
       cell.textLabel?.text = todoArray[indexPath.row].title
       return cell
   }
```
でテーブルセルに表示させたり、
```Swift
   func textFieldShouldReturn(_ textField: UITextField) -> Bool {
       let text = textField.text ?? ""
       todoArray.append(Todo(title: text))
       
       tableView.reloadData()
       // その他必要な処理
       return true
   }
```
で新規データを追加すればいいと思います。
同じような感じで、Todoの詳細(`Todo.todoDescription`)は遷移先でセットすればいいのではないでしょうか。
ちなみに、カスタムクラス(正確にはプロパティリスト)以外のクラスをUserDefaultsに保存するためには、さらにひと工夫必要です。
これについては過去の回答の後半に例がありますので、そちらも参考にしてみてください。
- [[teratail:250323] [swift 5]textViewで変えた色を違う画面のlabelに反映させたい](https://teratail.com/questions/250323)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る