Swift properyWrapper 无法将声明类型的值转换为指定类型的值
Swift properyWrapper cannot convert value of declared type to value of specified type
这是我的 属性 包装器:
@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
但是编译器报错:
Cannot convert value of type 'UserDefaultsBacked' to specified
type 'Bool'
我是不是做错了?
您已将 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?
我认为消除可选项是可行的方法,但为了完整起见,我将其包括在内。
这是我的 属性 包装器:
@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
但是编译器报错:
Cannot convert value of type 'UserDefaultsBacked' to specified type 'Bool'
我是不是做错了?
您已将 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?
我认为消除可选项是可行的方法,但为了完整起见,我将其包括在内。