如何解决如何在属性中集成枚举
下面的结构将适用于原始数据类型,例如Int
,String
,Double
等。有没有办法让此枚举适用于枚举,这样我就不会不必使用rawValues进行手动解析?
@propertyWrapper
struct Storage<T> {
let objectName: String
let defaultValue: T
let defaults: UserDefaults
init(_ objectName: String,defaultValue: T,defaults: UserDefaults = .standard) {
self.objectName = objectName
self.defaultValue = defaultValue
self.defaults = defaults
}
var wrappedValue: T {
get { return self.defaults.object(forKey: self.objectName) as? T ?? self.defaultValue }
set { self.defaults.set(newValue,forKey: self.objectName) }
}
}
目前,我的解决方法是将对象包装在另一个枚举器和setter中,以便像这样的枚举。
enum SomeType: String {
case foo,bar,baz
}
class Defaults {
@Storage("object",default: "")
private var: objectContainer: String
var object: SomeType? {
get {
return SomeType(rawValue: self.objectContainer)
}
set {
self.objectContainer = newValue.rawValue ?? ""
}
}
}
我试图为RawRepresentable
类型创建一个不同的属性包装器,但是Swift无法从中推断出T
的类型。
@propertyWrapper
struct RawRepresentableStorage<T: RawRepresentable> {
let objectName: String
let defaultValue: T
let defaults: UserDefaults
init(_ objectName: String,defaults: UserDefaults = .standard) {
self.objectName = objectName
self.defaultValue = defaultValue
self.defaults = defaults
}
var wrappedValue: T {
get {
guard let object = self.defaults.object(forKey: self.objectName) as? T else {
return self.defaultValue
}
// Error on this line:
// `Cannot convert value of type 'T' to expected argument type 'T.RawValue'`
return T(rawValue: object) ?? self.defaultValue
}
set {
self.defaults.set(newValue.rawValue,forKey: self.objectName)
}
}
}
即使只有少数几个,也不能为代码库中的每个可存储枚举创建Wrapper类型
我是否缺少某些东西,或者这是Swift的当前限制吗?
解决方法
在您的wrappedValue
获取器中,您强制转换为错误的类型。您正在将object
传递给T(rawValue:)
,因此其类型必须为T.RawValue
,而不是T
。
@propertyWrapper
struct RawRepresentableStorage<T: RawRepresentable> {
let objectName: String
let defaultValue: T
let defaults: UserDefaults
init(_ objectName: String,defaultValue: T,defaults: UserDefaults = .standard) {
self.objectName = objectName
self.defaultValue = defaultValue
self.defaults = defaults
}
var wrappedValue: T {
get {
guard let object = self.defaults.object(forKey: self.objectName) as? T.RawValue else {
return self.defaultValue
}
return T(rawValue: object) ?? self.defaultValue
}
set {
self.defaults.set(newValue.rawValue,forKey: self.objectName)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。