Stringの配列を保存する必要があったので、使い方を整理してみました。
Sponsor Link
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 を使うと便利な場面が多そうです。
説明は以上です。
Sponsor Link