我有一个基类和一个派生类...基类有一个类函数userDefaultKeyPrefix()
,它使用包装器指示用户默认存储的用户默认键
但是AdvancedManager
该类最终以BaseManager
类值userDefaultKeyPrefix()
"BASE.someVar"
而不是"ADVANCED.someVar"
为什么会发生这种情况以及如何达到预期的结果,所以关键是由班级给出
someVar 的 init 被称为 Base 类,而不是 Advanced
class BaseManager {
class func userDefaultKeyPrefix() -> String {
return "BASE"
}
@UserDefault(userDefaultKeyPrefix() + ".someVar", defaultValue: false) var someVar: Bool
}
class AdvancedManager: BaseManager {
override class func userDefaultKeyPrefix() -> String {
return "ADVANCED"
}
}
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
//let oldValue = wrappedValue
UserDefaults.standard.set(newValue, forKey: key)
UserDefaults.standard.synchronize()
}
}
}
更新:此波纹管按预期工作(关键是“ lazy
”),但破坏了属性包装器的干净代码
func prefix() -> String {
return String(describing: type(of: self))
}
lazy var _someVar = UserDefault(self.prefix() + ".someVar", defaultValue: "DEFAULT")
var someVar: String {
get {
return _someVar.wrappedValue
}
set {
_someVar.wrappedValue = newValue
}
}
欢迎任何更好的解决方案作为答案