【发布时间】:2020-12-29 14:39:38
【问题描述】:
在开发 UIKit 应用程序时,很容易通过定义协议并将所需的实现注入到 UIViewController 中来模拟 UserDefaults。
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 示例相同的灵活性?
【问题讨论】: