[Swifty] SwiftyUserDefaults で 配列を保存する方法

Swift

     

TAGS:

⌛️ < 1 min.
UserDefaults を、使いやすくする SwiftyUserDefaults ですが、配列の保存に使ったことがありませんでした。

Stringの配列を保存する必要があったので、使い方を整理してみました。

SwiftyUserDefaults の基本的な使い方

配列と使う前に基本的な使い方を説明してみます。

String 型の情報を、キー “server” で読込/保存するときの使い方です。

キーを定義

Extension で定義すると、以降の扱いが簡単になります。(Typo等が発生しません)

以下のコードで、”server” というキー値で、UserDefaults への読込/保存の準備をすることになります。

キー定義


extension DefaultsKeys {
    var server:DefaultsKey<String?> { .init("server") }
}

保存

ユーザーが値を設定した後や、アプリケーションが終了する直前に保存することになると思うのですが、以下のようなコードで保存することができます。

データ保存


  Defaults[\.server] = stringInApp

“.server”の箇所がキー値で、stringInApp が保存したい String 型変数です。

読込

アプリ起動時等には、以下のコードで、保存されていた値を読み出すことができます。

データ読込


  self.stringInApp = Defaults[\.server] ?? ""

“.server”がキー値で、ローカル変数の stringInApp に保存しています。

なお、UserDefaults への保存型が、String? なので、nil だったときに備えて、空文字(“”)を設定するようにしています。

SwiftyUserDefaults での配列の保存方法

上記で、基本的な使い方がわかると思いますので、配列の方法を説明します。

キーを定義

基本的に、Single Value の時と変わりません。

ただ、配列そのものが nil のケースを想定したくなかったので、空配列をデフォルト値に設定しています。

以下のコードで、”TopicList” というキー値で、UserDefaults への読込/保存の準備をすることになります。

キー定義


extension DefaultsKeys {
    var topicList:DefaultsKey<[String]?>{ .init("TopicList", defaultValue: [])}
}

保存

ここも、String とほとんど変わりません。対応する変数を用意して、Defaults[…] へ保存するだけです。

データ保存


  var topicArray:[String] = []
  for topic in self.topicModelList {
    topicArray.append(topic.topicName)
  }
  Defaults[\.topicList] = topicArray

“.topicList”の箇所がキー値で、topicArray が保存したい [String] 型変数です。

読込

読み込みも同様です。対応する変数を用意して、Defaults[…] から読み込みます。

データ読込


  let topicArray = Defaults[\.topicList] ?? []
  for topic in topicArray {
    if topic == "" { continue }
    let newTopic = MQTTTopicModel(name: topic)
    topicModelList.append(newTopic)
  }

“.topicList”がキー値で、ローカル変数の topicArray に保存しています。

# その後、アプリの内部モデルを作成しています。

まとめ:SwiftyUserDefaults は、保存対象が、Single value でも配列でもほとんど同じでした

SwiftyUserDefaults のドキュメントには、「配列も対応してます」としか書いていなくて、少し不安だったのですが、上記のように、String 等の Single value と同様に扱うことができます。

SwiftUI2.0 では、@AppStorage や @SceneStorage が出てきて、UserDefaults を意識しなくなり始めていますが、既存のアプリ等ではまだまだ SwiftUserDefaults を使うと便利な場面が多そうです。

説明は以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です