しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Defaultsを使ってUserDefaultsの管理を楽にする

Defaultsというライブラリを試してみました

github.com

新規にプロジェクトを作って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()
    }
}