SwiftUserDefaults

example workflow GitHub License SPM compatible

目录

  1. 介绍
  2. 如何使用
  3. 存储自定义数据
  4. 移除存储的对象
  5. 作者

介绍

这个包旨在轻松集成和简化对用户默认设置的访问,并且它支持 WWDC23 的新隐私规则。将其添加到您的项目非常简单:只需在主应用程序包中包含包链接,如下所示:

Screenshot 2024-03-15 at 3 28 47 AM

或者,导航到标记为“Files”的顶部部分,然后单击“Add Package Dependency”。

Screenshot 2024-03-15 at 3 33 08 AM

接下来,将存储库链接粘贴到搜索字段中,然后单击“Add Package”。

Screenshot 2024-03-15 at 3 34 52 AM

如何使用

此 API 的设计旨在简单直接,并且像使用 @AppStorage API 一样轻松,但功能更多。首先,此 API 是编译时安全的,可防止任何字符串拼写错误。只需在 DefaultKeys 中声明您的键,然后按如下所示将 @UserDefaults 添加到您的 varible 中 - 就这么简单。

@UserDefaults(\.previewShown) var previewShown = false // false is the default value
extension DefaultKeys {
   var previewShown: String { .init("previewShown") }
}

注意

您也可以像这样存储可选值。

@UserDefaults(\.previewShown) var previewShown: Bool?

自定义容器

您还可以像这样将您的 userDefaults 存储在自定义 container 中。

@UserDefaults(\.previewShown, .init(suiteName: "YourCustomeContainerName")) var previewShown = false

支持的数据

SwiftUserDefaults 支持所有标准的 NSUserDefaults 类型,例如 StringIntBoolArray 等等。

这是内置单值默认值的完整表格。

单值 数组
字符串 [字符串]
整数 [整数]
双精度浮点数 [双精度浮点数]
布尔值 [布尔值]
数据 [数据]
日期 [日期]
URL [URL]
[String: Any] [[String: Any]]

但是您也可以支持自定义数据类型 🚀

存储自定义数据

存储自定义数据类型非常简单;您只需要确保自定义数据类型符合 DefaultsCustomDataType,如下所示。

struct CustomeData: DefaultsCustomDataType {
 init()
}
@UserDefaults(\.customeData) var customeData = CustomeData()

DefaultsCustomDataType 是一个 public protocol,它符合 Codable 协议。它充当桥梁,使 API 可以轻松检测此数据类型是否需要编码。

示例 1 枚举

存储 Enum 非常简单;只需确保 Enum 符合 DefaultsCustomDataType,如下所示。

enum CustomeData: DefaultsCustomDataType {
case none
}
@UserDefaults(\.customeData) var customeData: CustomeData = .none

示例 2 自定义数组类型

存储自定义 Array 类型甚至更简单,只需确保 ArrayElement 类型符合 DefaultsCustomDataType,如下所示。

struct CustomeData: DefaultsCustomDataType {
init()
}
@UserDefaults(\.customeData) var customeData: [CustomeData] = [CustomeData()]

移除存储的对象

您还可以使用 DefaultKeys.removeObject(at keyPath: KeyPath<DefaultKeys, String>, _ container: UserDefaults = .standard) 移除特定键的存储值,如下所示。

@UserDefaults(\.testKey) var test = 3
DefaultKeys.removeObject(\.testKey)
// if you use a custome container provide it to the funcation using this syntax, 
// DefaultKeys.removeObject(at keyPath: KeyPath<DefaultKeys, String>, _ container: UserDefaults = .standard)

注意

当您在移除存储的值后调用 test 时,它将给出默认值,在本例中等于 3(未存储在 UserDefaults2 存储中)。如果它是一个 optional,则输出在本例中将为 nil

如果您想删除 UserDefaults 中的所有值,可以使用 DefaultKeys.removeAllUserDefaultsObjects(for container: UserDefaults = .standard)

@UserDefaults(\.testKey) var test = 3
DefaultKeys.removeAllUserDefaultsObjects()
// if you use a custome container provide it to the funcation using this syntax, 
// DefaultKeys.removeAllUserDefaultsObjects(for container: UserDefaults = .standard)

这就是全部内容!🚀 享受使用这个 Swifty 包吧。

作者

这个包由 Eng.Omar Elsayed 创建,旨在帮助 iOS 社区并让他们的生活更轻松。要联系我,请发送电子邮件至 eng.omar.elsayed@hotmail.com