Defaultsというライブラリを試してみました
新規にプロジェクトを作ってSPMでライブラリを追加します
キーの定義と値の取得・保存は下の通りです
import Defaults extension Defaults.Keys { static let quality = Key<Double>("quality", default: 0.8) } print(Defaults[.quality]) // → 0.8 Defaults[.quality] = 0.1 print(Defaults[.quality]) // → 0.1
UserDefaultsを使った形の値の取得もできます
print(UserDefaults.standard.double(forKey: "quality"))
他にもOptionalやDate型を扱ったりtextのようにブロックで初期化する事ができます
extension Defaults.Keys { static let quality = Key<Double>("quality", default: 0.8) static let name = Key<String?>("name") static let date = Key<Date>("date", default: Date()) static let text = Key<String>("text") { return "1" } }
下のようにCodableとDefaults.Serializableに準拠したクラスや構造体も扱う事が可能です
struct MyStruct: Codable, Defaults.Serializable { let name: String } class MyClass: Codable, Defaults.Serializable { var name = "" } extension Defaults.Keys { static let myStruct = Key<MyStruct>("myStruct", default: MyStruct(name: "name")) static let myClass = Key<MyClass>("myStruct", default: MyClass()) }
下の形で値の変更を監視する事ができます
ブロック内は最初に一回呼ばれてその後は変更がある度に呼ばれます
Task { for await value in Defaults.updates(.date) { print("newValue", value) } }
下の形でSwiftUIのViewとスムーズな連携をする事ができます
extension Defaults.Keys { static let isOn = Key<Bool>("isOn", default: false) } struct ContentView: View { @Default(.isOn) var isOn var body: some View { VStack { Toggle("test", isOn: $isOn) } .padding() } }