使用我的键/值字符串文件,我正在寻找一种更简单的方法来提取值,方法是将枚举传递给函数,该函数执行查找并返回该值。
此字符串文件可以通过网络更新,因此我的应用程序附带默认版本。目前,为了将这些默认值存入内存,我迭代了我的枚举案例并将字符串添加到字典中。
看起来像这样:
enum StringKeys: String, CaseIterable {
case string1
case string2
case string3
}
func setupDefaults() {
for key in StringKeys.allCases {
defaults[key] = stringFile.value(forKey: key)
}
}
func getValue(for: StringKeys) -> String {
// stuff here...
}
一段时间以来一切都很好,但是这个枚举变得非常大,因此自动完成的帮助不大。
我想要的是更像这样的东西:
enum StringKeys: CaseIterable {
enum Feature1: String, CaseIterable {
case title1
case button1
}
enum Feature2: String, CaseIterable {
case title3
case toggle1
}
}
然后调用我的 getValue
函数:
titleLabel.text = Strings.getValue(for: StringKeys.Feature1.title1)
这也完全没问题,但我无法弄清楚如何迭代这些嵌套键以一种非常干净的方式构建默认字典。
我尝试扩展 CaseIterable
以添加一点 allCasesRecursive
函数。这是 Swift 不允许的。
我知道这可以通过在每个枚举中添加一个属性、返回 allCases
并在每个父级将它们组合在一起来完成。但这仍然有点困惑。
另一种选择是不使用枚举来设置默认值,而只是解析整个文件并将其直接放入默认值,但我更希望枚举决定默认值中的内容。这也便于查看是否缺少任何内容,即找不到该键的默认值,我可以抛出错误。
所以,基本上我想把一堆嵌套的枚举变成一个平面字典。即使只是一组键也足以让我完成剩下的工作。是否可以通过嵌套枚举递归向下钻取?我可以使用反射来解决这个问题吗?
我也对其他想法持开放态度,否则我会坚持使用巨大的平面枚举。
最佳答案
我不知道我是否理解正确你的问题,也许这会有所帮助
// Create a protocol
protocol StringKeyValue {}
enum StringKeys: CaseIterable {
enum Feature1: String, CaseIterable, StringKeyValue {
case title1
case button1
}
enum Feature2: String, CaseIterable, StringKeyValue {
case title3
case toggle1
}
}
func getValue(for: StringKeyValue) -> String {
return "hi there"
}
// Maybe this's what you want?
titleLabel.text = getValue(for: StringKeys.Feature1.title1)
关于swift - 如何从嵌套枚举中获取所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57816145/