假设我有一个使用
现在如果我想在某个地方使用它,比如说在视图模型中,我会有这样的代码。
UserDefaults
的非常常见的属性包装器用例。@propertyWrapper
struct DefaultsStorage<Value> {
private let key: String
private let storage: UserDefaults
var wrappedValue: Value? {
get {
guard let value = storage.value(forKey: key) as? Value else {
return nil
}
return value
}
nonmutating set {
storage.setValue(newValue, forKey: key)
}
}
init(key: String, storage: UserDefaults = .standard) {
self.key = key
self.storage = storage
}
}
我现在声明了一个对象来保存我在UserDefaults
中存储的所有值。
struct UserDefaultsStorage {
@DefaultsStorage(key: "userName")
var userName: String?
}
现在如果我想在某个地方使用它,比如说在视图模型中,我会有这样的代码。
final class ViewModel {
func getUserName() -> String? {
UserDefaultsStorage().userName
}
}
这里有几个问题。
- 在这种情况下,似乎我必须使用
.standard
用户默认设置。如何使用其他/模拟的UserDefaults
实例来测试视图模型? - 如何使用其他/模拟的
UserDefaults
实例来测试该属性包装器?我是否必须创建一个新类型,该类型是上述DefaultsStorage
的干净副本,传递模拟的UserDefaults
并测试该对象?
struct TestUserDefaultsStorage {
@DefaultsStorage(key: "userName", storage: UserDefaults(suiteName: #file)!)
var userName: String?
}
UserDefaultsStorage
吗? - gasho