質問: self.toDoItems?[indexPath.row] // トランザクションを開始してオブジェクトを削除します try! realm.write { realm.delete(deleteHistory!) } // TableViewを再読み込み. self.tableView.reloadData() } } ```
回答: ご提示の処理だと、1行ごとに同じファイルに上書き保存していることになります。 結果的に最後の行だけが保存されます。 保存すべきデータを用意したあと、そのデータを保存するようにしてください。 まず、保存するデータを用意します。 ``` // ガード条件を用意して、エラー時には早期リターンした方が良い。 // また、オプショナルは早期に、かつ安全にアンラップする。 guard let items = toDoItems else { print("データがない") return } // 各name.descriptionプロパティを改行で連結 let descriptions = items.map { $0.name.description }.joined(separator: "\n") ``` ついで、これを保存します。 ``` do { // do {} の中には try がない文も書いていい // 上の保存データの生成は、まとまりとしてはここに書いた方が読みやすい let descriptions = items.map { $0.name.description }.joined(separator: "\n") // 文脈的に解釈可能であれば String.Encoding.shiftJIS は .shiftJIS に省略可能。 // // 本当に shift JIS で保存する必要がありますか? // ほとんどの場合 UTF8 の方が安全です。 try descriptions.write(toFile: thePath, atomically: true, encoding: .shiftJIS) } catch { // わざわざ NSError に変換する必要はない。また、記述がなければ Error は変数 error に自動的に代入される。 print("保存に失敗。\n \(error)") } ``` あと、この質問とは関係ないですが、実際の保存はユーザーが保存を選んだ後に行った方が良いでしょう。 無駄な処理が減ります。 さらに、保存に時間がかかるようなら、保存は別スレッドで行う方が良いでしょう。 ユーザビリティが向上します。