属性包装器作为自定义属性:从持久化到约束验证
超越 @State 和 @Binding,实现自己的属性包装器将持久化、验证与通知逻辑嵌入存储访问中,且兼容 Codable。 · 难度:入门 · +10XP
自定义属性包装器
属性包装器在访问属性值时插入自定义逻辑。我们构建一个 @Persisted(key:) 包装器,将值自动存入 UserDefaults;一个 @Validated 包装器,在写值前检查闭包条件;两者都可以组合使用。
@propertyWrapper
struct Persisted<T> {
private let key: String
private let defaultValue: T
var wrappedValue: T {
get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
set { UserDefaults.standard.set(newValue, forKey: key) }
}
init(wrappedValue: T, key: String) {
self.key = key
self.defaultValue = wrappedValue
}
}
class Settings {
@Persisted(key: "volume") var volume: Double = 0.5
}