SwiftUIでToDoリストを作ろー! 7
データの永続化、保存する方法を実装していきます。ListViewModel)にコードを追加していきます。UserDefaultsを使います。
keyとなる変数を設定します。
配列wordsを保存します。UserDefaults.standard.setで保存
変数wordsを読み込み時にdidsetで関数 saveItems()を実行させ保存していきます。
@Published var words:[Model] = [] {
didSet{
saveItems()
}
}
以下の関数でwordsを使う時に保存をセットします。
func deleteItem(indexSet:IndexSet){
words.remove(atOffsets: indexSet)
}
func moveItem(from: IndexSet,to: Int){
words.move(fromOffsets: from, toOffset: to)
}
func addItem(name:String){
let newItem = Model(name: name, isComp: false)
words.append(newItem)
}
この関数が動くときにそれぞれ保存することになります。
アプリ立ち上げ時には保存されているデータをinit()で関数を読み込みます。
変数dataにUserDefaultsで保存してあるデータを代入してやります。
変数saveItemに入れてやり、
でデータ確保している配列wordsに入れてやります。
init(){
getWord()
}
func getWord(){
guard
let data = UserDefaults.standard.data(forKey: wordList),
let saveItem = try? JSONDecoder().decode([Model].self, from: data)
else {return}
self.words = saveItem
}
これでアプリの立ち上げから新規保存、データの削除時などについて状態が保存されるようになります。
ListViewModel全体は
class ListViewModel:ObservableObject{
@Published var words:[Model] = [] {
didSet{
saveItems()
}
}
let wordList:String = "wordList"
init(){
getWord()
}
func getWord(){
guard
let data = UserDefaults.standard.data(forKey: wordList),
let saveItem = try? JSONDecoder().decode([Model].self, from: data)
else {return}
self.words = saveItem
}
func deleteItem(indexSet:IndexSet){
words.remove(atOffsets: indexSet)
}
func moveItem(from: IndexSet,to: Int){
words.move(fromOffsets: from, toOffset: to)
}
func addItem(name:String){
let newItem = Model(name: name, isComp: false)
words.append(newItem)
}
func updateItem(word:Model){
if let index = words.firstIndex(where:{$0.id == word.id}){
words[index] = Model(name: word.name, isComp: !word.isComp)
}
}
func saveItems(){
if let encodeData = try? JSONEncoder().encode(words){
UserDefaults.standard.set(encodeData,forKey:wordList)
}
}
}
この記事が気に入ったらサポートをしてみませんか?