BigUIUserPreferences

用于 UserDefaults 的强类型 Swift 和 SwiftUI 封装器。

此软件包为 UserDefaults 添加了两个新接口

  1. 用于 SwiftUI 视图的 @UserPreference 属性包装器
@UserPreference(MiniSidebarKey.self) private var enabled
  1. 用于 UserDefaults 的下标接口
UserDefaults.standard[MiniSidebarKey.self] = true

通过将键名和默认值与 UserPreferenceKey 紧密结合,您可以消除键名拼写错误、默认值不同以及类型不匹配的可能性。此软件包还增加了对 CodableDate 类型的支持。

安装

将此仓库添加到您的 Package.swift 文件

.package(url: "https://github.com/notsobigcompany/BigUIUserPreferences.git", from: "1.0.0")

如果您要添加到 Xcode 项目,请转到 File -> Add Packages,然后将软件包链接到您所需的目标。

开始使用

首先声明一个 UserPreferenceKey 类型并指定一个默认值

struct MiniSidebarKey: UserPreferenceKey {
    static let defaultValue: Bool = false
}

提示

EnvironmentKeyUserPreferenceKey 具有完全相同的类型要求。

SwiftUI

使用该键,您可以使用 @UserPreference 属性包装器在 SwiftUI 视图内部访问该值

struct MiniSidebarToggle: View {
    
    @UserPreference(MiniSidebarKey.self) private var enabled
    
    var body: some View {
        Toggle(isOn: $enabled) {
            Text("Enable Minibar")
        }
    }
}

AppStorage 不同,您无需指定类型或默认值。

该包装器始终反映 UserDefaults 中的最新值,并在任何外部更改时使视图失效。

下标

您还可以通过直接在 UserDefaults 本身上使用 subscript 接口来访问该值

let defaults = UserDefaults.standard 
defaults[MiniSidebarToggle.self] = true 

var isMiniBarEnabled = defaults[MiniSidebarToggle.self]
// true
print(isMiniBarEnabled)

注意

如果存储中没有值,则下标 API 将返回键的默认值,而不是存储的默认值。

支持的类型

Codable 值

您可以通过将值包装在 CodablePreferenceValue 中来存储小的 Codable

struct User: Codable, Equatable {
    // ...
}

struct LoggedInUserKey: UserPreferenceKey {
    static var defaultValue: CodablePreferenceValue<User?> = .init()
}

重要提示

包装器本身不能是可选的,但底层包装的类型可以是可选的。

然后,您可以通过调用 wrappedValue 来访问底层值

@UserPreference(LoggedInUserKey.self) private var user

var body: some View {
    if let user = user.wrappedValue {
        Text("Hello \(user.username)")
    }
}

显式键名

默认情况下,UserPreferenceKey 使用自动生成的键名来查找存储内部的值。如果您希望使用显式键名(例如,为了支持预先存在的值),请采用 ExplicitlyNamedUserPreferenceKey 并返回一个 name

struct MyExplicitPreferenceKey: ExplicitlyNamedUserPreferenceKey {
    static let defaultValue: Bool = false
    // The name of the value inside the store
    static let name: String = "my_explicit_key"
}

要求

许可证

版权所有 2023 NOT SO BIG TECH LIMITED

特此授予任何获得本软件和相关文档文件(“软件”)副本的人员免费许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,并允许向获得本软件的人员提供本软件,但须符合以下条件

上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为或其他方面,因本软件或本软件的使用或其他交易而产生、由此产生或与之相关的责任。