【发布时间】:2021-02-09 21:22:15
【问题描述】:
如何在 Swift 中实现一个管理 UserDefaults 映射的结构? 现在我有一些不同类型的计算属性 a、b、c、d 和对应的键,如下所示:
enum UserDefaultsKeys {
a_key
b_key
...
}
var a: String {
get { UserDefaults.standard.string(forKey: UserDefaultsKeys.a_key.rawValue) }
set { UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.a_key.rawValue) }
}
var b: Int {
get { UserDefaults.standard.integer(forKey: UserDefaultsKeys.b_key.rawValue) }
set { UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.b_key.rawValue) }
}
...
我想要实现的是实现一个结构,该结构具有字符串类型的键和泛型类型值。
值获取函数应该 - 根据它的类型 - 选择使用 UserDefaults.standard.string 或 UserDefaults.standard.integer 以便我可以使用一些键创建一个 DefaultsVar,而其他所有内容都会为我自动管理。
我到目前为止是这样的:
struct DefaultsVar<T> {
let key: String
var value: T {
get {
switch self {
case is String: return UserDefaults.standard.string(forKey: key) as! T
case is Int: return UserDefaults.standard.integer(forKey: key) as! T
default: return UserDefaults.standard.float(forKey: key) as! T
}
}
set { UserDefaults.standard.set(newValue, forKey: key) }
}
}
我收到以下错误:“从 DefaultsVar 转换为不相关的类型 'String' 总是失败。 我对 swift 完全陌生(对编程也相对较新)并且并不真正了解如何以正确的方式实现这一点 - 或者这甚至是一种被认为是一种好的做法。有人可以对此有所了解吗?
提前谢谢你!
【问题讨论】:
-
有什么好处?
UserDefaults的 setter 是 已经是通用的,只有少数支持的类型。 -
我认为它可能会阻止所有变量的一些样板代码。
标签: swift generics data-structures struct