Swift ProperyWrapper не может преобразовать значение объявленного типа в значение указанного типа

Вот моя обертка свойств:

@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

Я делаю это неправильно?

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?

Я думаю, что отказ от опций - это правильный путь, но я включаю это для полноты картины.

Другие вопросы по тегам