我想创建一个枚举,该枚举将在我的应用程序中包含所有的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()
似乎我必须编写另一个函数才能从关联的枚举类型获取原始值。我觉得可能有更好的方法,有建议吗?
答案 0 :(得分:0)
一种方法是将枚举与静态常量混合
enum UserDefaultsKeys {
enum Session {
static let isLoggedIn = "key1"
static let ...
}
enum Preferences {
static let rememberLoginEmail = "key2"
}
}
然后通过它们的路径访问它们
let isLoggedInKey = UserDefaultsKeys.Session.isLoggedIn
答案 1 :(得分:0)
我建议使用这种解决方案
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)
仅使用一种抽象的情况和协议,而不使用多项