SwiftUI - UserDefaultsとAppStorageについて

1. UserDefaultsの使い方

UserDefaultsは、キーと値のペアでデータを永続化できるものです。役割や機能的にウェブでいうところのlocalStorageにあたるものだと思います。たくさんのデータや、個人を特定できるようなデータではなく、アプリの設定などを保存する場所。アプリの削除と共に保存されたデータも消える。使用するときはキーと値を保存して、その保存したものを呼び出します。

//キーと値の保存
UserDefaults.standard.set(値, forKey: "キー")

保存したデータを呼び出すときは、保存した値の型に合わせて呼び出します。

//呼び出し
UserDefaults.standard.object(forKey: "キー") //Any?
UserDefaults.standard.url(forKey: "キー") //URL?
UserDefaults.standard.array(forKey: "キー") //[Any]?
UserDefaults.standard.dictionary(forKey: "キー") //[String : Any]?
UserDefaults.standard.string(forKey: "キー") // String?
UserDefaults.standard.stringArray(forKey: "キー") //[String]?
UserDefaults.standard.data(forKey: "キー") //Data?
UserDefaults.standard.bool(forKey: "キー") //Bool
UserDefaults.standard.integer(forKey: "キー") //Int
UserDefaults.standard.float(forKey: "キー") //Float
UserDefaults.standard.double(forKey: "キー") //Double
UserDefaults.standard.dictionaryRepresentation(forKey: "キー") //[String : Any]

//型がない場合
UserDefaults.standard.object(forKey: "キー") as? Date
//指定したキーを削除
UserDeafaults.standard.removeObject(forKey: "キー")

//全てのキーを削除
let appDomain = Bundle.main.bundleIdentifier
UserDefaults.standard.removePersistentDomain(forName: appDomain!)

Bundle - ディスク上のバンドルディレクトリに保存されているコードとリソース
bundleIdentifier - 受信者のバンドル識別子
removePersistentDomain - 指定された永続ドメインのコンテンツをユーザーのデフォルトから削除

2. UserDefaultsを使ってみる

このコードはQiitaさんの簡易的にUserDefaultsを使う方法という記事のコードを参考に少し変更を加えたものです。文字入力したものをUserDefaultsに保存して、ビューが表示されたときに保存したものを呼び出すということをしています。

import SwiftUI

struct ContentView: View {
  @State var input:String = ""
  @State var output:String = ""
  
  var body: some View {
    VStack {
      Text("\(output)")
      TextField(
        "input",
        text: $input,
        onCommit: {
          output = input
          UserDefaults.standard.set(output, forKey: "outputKey")
        }
      )
      .padding()
      .textFieldStyle(RoundedBorderTextFieldStyle())
      
      .onAppear {
        guard let appearText = UserDefaults.standard.string(forKey: "outputKey") else { return }
        output = appearText
      }

      Button("Button", action: {
        UserDefaults.standard.removeObject(forKey: "outputKey")
      })
    }
  }
}

onCommit - リターンキーのアクショントリガー

ここで使用しているonCommitは、非推奨になり、今後はonSubmitになるようです。
onSubmit(of:_:) | Apple Developer Documentation

3. AppStorageの使い方

AppStorageはUserDefaultsの新しいもので機能や保存場所は同じ。iOS14から使用できる機能なのでiPhone6s以降が対象です。UserDefaultsとの違いは、@Stateのようにキーと値を設定でき、自動で呼び出されるので、呼び出しが不要になります。

@AppStorage("キー") var= 初期値
//or
@AppStorage(wrappedValue: 初期値, "キー") var

4. AppStorageを使ってみる

上記のUserDefaultsを使ったコードと内容は同じです。

import SwiftUI

struct ContentView: View {
  @State var input:String = ""
  @AppStorage("outputKey") var output:String = ""
  
  var body: some View {
    VStack {
      Text("\(output)")
      TextField(
        "input",
        text: $input,
        onCommit: {
          output = input
        }
      )
      .padding()
      .textFieldStyle(RoundedBorderTextFieldStyle())
      
      Button("Button", action: {
        UserDefaults.standard.removeObject(forKey: "outputKey")
      })
    }
  }
}

UserDefaults | Apple Developer Documentation
Bundle | Apple Developer Documentation
AppStorage | Apple Developer Documentation