Swift枚举,从关联的枚举中获取原始值

时间:2019-12-29 07:15:24

标签: swift enums

我想创建一个枚举,该枚举将在我的应用程序中包含所有的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()

似乎我必须编写另一个函数才能从关联的枚举类型获取原始值。我觉得可能有更好的方法,有建议吗?

2 个答案:

答案 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)

仅使用一种抽象的情况和协议,而不使用多项