見出し画像

SwiftUIでToDoリストを作ろー! 7

データの永続化、保存する方法を実装していきます。ListViewModel)にコードを追加していきます。UserDefaultsを使います。

keyとなる変数を設定します。

let wordList:String = "wordList"

配列wordsを保存します。UserDefaults.standard.setで保存

func saveItems(){
   if let encodeData = try? JSONEncoder().encode(words){
     UserDefaults.standard.set(encodeData,forKey:wordList)
   }
}

変数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()で関数を読み込みます。

let data = UserDefaults.standard.data(forKey: wordList),

変数dataにUserDefaultsで保存してあるデータを代入してやります。

try? JSONDecoder().decode([Model].self, from: data)
else {return}

変数saveItemに入れてやり、

self.words = 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)
        }
    }
}

この記事が気に入ったらサポートをしてみませんか?