0

我想制作一个枚举,它可以携带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()

看来我必须编写一个完整的另一个函数来从关联的枚举类型中获取原始值。我觉得可能有更好的方法,有什么建议吗?

4

2 回答 2

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)

只使用一个抽象案例和协议而不是几个项目

于 2019-12-29T11:06:54.453 回答
0

一种方法是将枚举与静态常量混合

enum UserDefaultsKeys {
    enum Session {
        static let isLoggedIn = "key1"
        static let ...
    }

    enum Preferences {
        static let rememberLoginEmail = "key2"
    }
}

然后通过它们的路径访问它们

let isLoggedInKey = UserDefaultsKeys.Session.isLoggedIn
于 2019-12-29T09:23:50.673 回答