考虑以下代码,其中我声明了一个包含子枚举的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 键,那可能是一个巨大的混乱。
您需要switch
type
参数并进行模式匹配:
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))
)。