4

这是我的属性包装器:

@propertyWrapper struct UserDefaultsBacked<Value> {
    let key: String
    let storage: UserDefaults = .standard
    var defaultValue: Value

    var wrappedValue: Value? {
        get {
            let value = storage.value(forKey: key) as? Value
            return value ?? defaultValue
        }
        set { storage.setValue(newValue, forKey: key) }
    }
}

这个变量 snapStatus 应该有一个布尔值,对吧?

@UserDefaultsBacked(key: "snap-is-enabled", defaultValue: false)
var snapStatus: Bool

但是编译器会抛出一个错误:

无法将“UserDefaultsBacked”类型的值转换为指定类型“Bool”

在此处输入图像描述

我做错了吗?

4

1 回答 1

1

您已将其声明wrappedValue为可选项,例如Value?. 将其更改为不是可选的,错误将消失:

@propertyWrapper struct UserDefaultsBacked<Value> {
    let key: String
    let storage: UserDefaults = .standard
    var defaultValue: Value

    var wrappedValue: Value {   // not `Value?`
        get {
            let value = storage.value(forKey: key) as? Value
            return value ?? defaultValue
        }
        set { storage.setValue(newValue, forKey: key) }
    }
}

或者,您可以保持wrappedValue原样,但是您必须声明snapStatus为可选:

var snapStatus: Bool?

我认为消除选项是可行的方法,但为了完整起见,我将其包括在内。

于 2020-02-27T18:44:51.750 回答