ios - SwiftUI 中的可模拟 @AppStorage
问题描述
在开发 UIKit 应用程序时,UserDefaults
通过定义协议并将所需的实现注入到UIViewController
.
protocol Defaults {
var numberOfHandsPlayed: Int { get set }
}
struct AppDefaults: Defaults {
static let shared = AppDefaults()
private let userDefaults = UserDefaults.standard
struct Keys {
private init() {}
static let numberOfHandsPlayed = "numberOfHandsPlayed"
}
var numberOfHandsPlayed: Int {
get {
userDefaults.integer(forKey: Keys.numberOfHandsPlayed)
}
set(numberOfHandsPlayed) {
userDefaults.setValue(numberOfHandsPlayed, forKey: Keys.numberOfHandsPlayed)
}
}
}
struct MockDefaults: Defaults {
var numberOfHandsPlayed: Int {
get {
// mocking behaviour
}
set(numberOfHandsPlayed) {
// mocking behaviour
}
}
class PracticeViewController: UIViewController {
private var defaults: Defaults?
// defaults can be set to MockDefaults or AppDefaults
}
但现在有了 SwiftUI,我可以使用@AppStorage
属性包装器执行以下操作:
@AppStorage("numberOfHandsPlayed") var numberOfHandsPlayed: Int = 3
SwiftUI 中是否有一个干净的解决方案来模拟这个属性包装器并具有与我的 UIKit 示例相同的灵活性?
解决方案
AppStorage
允许指定要使用的存储(默认为标准)UserDefaults
,因此可以将此功能用于您的目的。
一种可能的方法是对标准用户默认值进行子类化,然后在需要时/在需要时对其进行模拟。
class MyUserDefaults: UserDefaults {
// override/add anything needed here
}
struct DemoView: View {
@AppStorage("numberOfHandsPlayed", store: MyUserDefaults()) var numberOfHandsPlayed: Int = 3
// ... other code
推荐阅读
- c++ - 声明要在类级别实例化的变量,并在类函数中使用
- python - Discord.py on_member_update 不起作用,启用了成员意图
- c# - Powershell 将 listBox 项转为数组格式
- string - 如何在字符串集合中有效地找到几乎相同的指定长度的子字符串?
- pandas - Python Pandas Switch Case 语句 - 从数据框中的现有列值生成新列
- java - 初始化错误失败 java.lang.ExceptionInInitializerError 在 TestWithResourcesExtension.java
- python - 将实例变量传递给装饰器类中的包装器
- html - 如何动态设置绑定到表中数据源的复选框列表的宽度?
- python - 区域上的空间数据分布
- apache-superset - 有没有办法在 Apache Superset 的 SQL 实验室中创建绑定变量?