【问题标题】:Swift enum, get raw value from associated enumSwift枚举,从关联的枚举中获取原始值
【发布时间】:2019-12-29 07:15:24
【问题描述】:

我想创建一个枚举,它可以在我的应用中携带所有 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()

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

【问题讨论】:

  • 我有一个建议让您以一种非常 Swifty 和类型安全的方式访问所有用户默认值,那就是使用 PropertyWrapper
  • 您的问题非常具体到 enum,请将您的问题更改为更一般的问题,如果您需要帮助,请告诉我。

标签: swift enums


【解决方案1】:

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

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

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

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

let isLoggedInKey = UserDefaultsKeys.Session.isLoggedIn

【讨论】:

    【解决方案2】:

    我建议使用这样的解决方案

    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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多