我想创建一个枚举,它将在我的应用程序中携带所有UserDefaults
键。
enum UserDefaultsKeys: String {
case isLoggedIn
case rememberLoginEmail
}
同时,我也希望对其进行分类,以便一个枚举没有来自不同模块的太多键,所以我这样做了:
enum UserDefaultsKeys {
case session(key: UserSessionKeys)
case userPreference(key: UserPreferenceKeys)
func key() -> String{
switch self {
case .session(let key):
return key.rawValue
case .userPreference(let key):
return key.rawValue
}
}
}
enum UserSessionKeys: String {
case isLoggedIn
}
enum UserPreferenceKeys: String {
case rememberLoginEmail
}
我现在可以通过这个访问原始值:UserDefaultsKeys.session(key: .isLoggedIn).key()
似乎我必须编写一个完整的另一个函数才能从关联的枚举类型中获取原始值。我觉得可以有更好的方法,有什么建议吗?
一种方法是将枚举与静态常量混合
enum UserDefaultsKeys {
enum Session {
static let isLoggedIn = "key1"
static let ...
}
enum Preferences {
static let rememberLoginEmail = "key2"
}
}
然后通过其路径访问它们
let isLoggedInKey = UserDefaultsKeys.Session.isLoggedIn
我建议使用这样的解决方案
enum UserDefaultsKeys {
case abstractContainer(key: KeyContainer)
var key: String {
switch self {
case .abstractContainer(let key):
return key.rawValue
}
}
}
protocol KeyContainer {
var rawValue: String { get }
}
enum UserSessionKeys: String, KeyContainer {
case isLoggedIn
}
enum UserPreferenceKeys: String, KeyContainer {
case rememberLoginEmail
}
let u = UserDefaultsKeys.abstractContainer(key: UserSessionKeys.isLoggedIn)
print(u.key)
仅使用一个抽象案例和协议,而不是多个项目