[SwiftUI] SwiftUI の Color を UserDefaults に保存する

SwiftUI

SwiftUI の Color を UserDefaults に保存する方法を説明します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Big Sur 11.1
  • Xcode 12.3
  • iOS 14.2
  • SwiftyUserDefaults

Color を UserDefaults に保存

NSColor や UIColor もありますが、SwiftUI で使うのは、Color です。

UserDefaults は、アプリのちょっとした情報を保存することができ非常に便利ですが、保存できるタイプが制限されています。

Color は、保存できるタイプではありません。(UIColor, NSColor もサポート対象ではありません。)

この記事では、Color を UserDefaults に保存する方法を説明します。

SwiftyUserDefaults

UserDefaults を扱う時に便利な SwiftyUserDefaults を使います。

SwiftyUserDefaults は、こちら

DefaultsKEys の extension を定義することで、Defaultas[キー] のような形でのアクセスが可能となるライブラリです。

前準備

Color の情報は、RGB 情報で再構成できるはずなので、UserDefaults には、RGB 情報を保存しておくことにします。
しかし、問題がひとつあります。Color を RGB 値から作成することはできるのですが、Color から RGB 値を取得することはできません。

ですので、以下のような extension を作り、RGB(A) 値を取得できるようにしておきます。

Color#rgbValues

# iOS と macOS のどちらからも使えるように、UIColor/NSColor を typealias で別名定義して使用しています

Color を保存

2つの方法があります。少し方法が異なりますが、どちらも RGB 値を保存して、RGB 値から Color を再現するところは同じです。

直接 RGB 値を保存

1つの Color に対して、R/G/B それぞれの値を保存する用のキーを作成します。

DefaultsKeys 定義
実装

Color を Serializable にして保存

Color を Codable に準拠させるような extension を用意して、Serializable な型とすることで、encode/decode の仕組みを使って保存します。

Color を Codable に
DefaultsKeys 定義
実装

使い分け?

1つ目の方法は、自分で Color を分解して保存、読み込んで組み立てることをしています。

2つ目の方法は、Color を Codable に準拠させ、あとは、元からある仕組みを使って保存する方法です。

保存対象の Color が1つしかないのであれば、大きな差はありませんが、複数の Color を扱う必要があるのであれば、2つ目の方法が便利になりそうです。

テストに使ったコード

以下のコードを使ってテストしています。非常にシンプルなコードですが、参考までに貼っておきます。

example

まとめ:Color を UserDefaults に保存する

Color を UserDefaults に保存する
  • RGB 値それぞれを個別に保存する
  • Color を Codable 準拠にして保存する
  • (補足) Color から RGB 値を取得するときは、UIColor/NSColor を使うと便利

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

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