子枚举原始值



考虑以下代码,其中我声明了一个包含子枚举的enum

enum LocalizeKey {
case message(Messages)
case buttons(Buttons)
enum Buttons: String {
case remove = "Remove"
case add = "Add"
}
enum Messages: String {
case success = "Success"
case failure = "Failure"
}
}

在没有子枚举的正常enum中,我们可以轻松访问.rawValue属性并获得我们选择的任何情况的原始值。

对于这种情况,我创建了一个这样的函数,只是为了检查我得到了什么。

func keyString(for type: LocalizeKey) {
print(type)
}
keyString(for: .message(.failure)) // usage

问题:除了.self之外,没有其他属性可以访问此LocalizeKey枚举。

想要实现的目标:也许您可以通过命名来关联,我正在尝试包装我的本地化密钥,以便我可以根据密钥类型等轻松访问它们,并且引用实际密钥的rawValue将进入getLocalizedValue功能。

操场输出:使用操场输出上面的函数是

message(__lldb_expr_21.LocalizeKey.Messages.failure)

编辑:不必创建一个变量来在每种情况下切换自我,想象一下,如果我们有 +400 键,那可能是一个巨大的混乱。

您需要switchtype参数并进行模式匹配:

switch type {
case .message(let messages): return messages.rawValue
case .buttons(let buttons): return buttons.rawValue
}

您也可以将其作为LocalizeKey的扩展:

extension LocalizeKey {
var keyString: String {
switch self {
case .message(let messages): return messages.rawValue
case .buttons(let buttons): return buttons.rawValue
}
}
}

你将不得不在某个地方切换。如果只有少数"子枚举",那么手动编写开关可能是最简单的:

func keyString(for type: LocalizeKey) {
switch type {
case .message(let message):
print(message.rawValue)
case .buttons(let button):
print(button.rawValue)
}
}

如果您不想手动编写,则必须更改数据结构以使其不需要,或者使用为您生成样板的代码生成工具。

尽管上述答案确实提供了解决方案,但我会提到方法本身的问题:

此时,必须在switch语句中添加每个新案例(键)并带有关联的值,这似乎是不需要的样板编码;我假设您可以想象当枚举中有许多案例时会是什么样子。

因此,我建议遵循一种更加动态的方法,而不是在switch语句中手动添加每个案例的值。例:

protocol Localizable {
var value: String { get }
}
extension RawRepresentable where Self: Localizable, Self.RawValue == String {
var value: String { return rawValue }
}
extension CustomStringConvertible where Self: RawRepresentable, Self.RawValue == String {
var description: String { return rawValue }
}
struct LocalizeKey {
enum Buttons: String, Localizable, CustomStringConvertible {
case remove = "Remove"
case add = "Add"
}
enum Messages: String, Localizable, CustomStringConvertible {
case success = "Success"
case failure = "Failure"
}
}

我们正在为您的代码应用相同的逻辑,并进行一些改进以使其更易于维护。

基于此,您仍然可以将函数实现为:

func keyString(for type: Localizable) {
print(type)
}

用法:

keyString(for: LocalizeKey.Buttons.add) // Add
keyString(for: LocalizeKey.Messages.success) // Success

IMO,我发现这样称呼它似乎更具可读性,更直接,而不是建议的方法(keyString(for: .message(.failure)))。

最新更新