假设我有一个使用 的属性包装器的非常常见的用例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
}
}
Run Code Online (Sandbox Code Playgroud)
我现在声明一个对象,该对象将保存存储在UserDefaults.
struct UserDefaultsStorage {
@DefaultsStorage(key: "userName")
var userName: String?
}
Run Code Online (Sandbox Code Playgroud)
现在,当我想在某个地方使用它时,比如说在视图模型中,我会有这样的东西。
final class ViewModel {
func getUserName() …Run Code Online (Sandbox Code Playgroud)