1

我有一个基类和一个派生类...基类有一个类函数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
    }
}

欢迎任何更好的解决方案作为答案

4

0 回答 0