swift - 如何从嵌套枚举中获取所有值?

标签 swift

使用我的键/值字符串文件,我正在寻找一种更简单的方法来提取值,方法是将枚举传递给函数,该函数执行查找并返回该值。

此字符串文件可以通过网络更新,因此我的应用程序附带默认版本。目前,为了将这些默认值存入内存,我迭代了我的枚举案例并将字符串添加到字典中。

看起来像这样:

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/

相关文章:

arrays - json转key-->value格式

xcode - 如何在 Swift 中的文件之间共享常量和变量

Swift动画查询

ios - 如何根据 UITableViewCells 的高度调整 UITableView 的高度?

swift - iCloud 核心数据版本迁移

ios - Swift 中静态 TableView 中特定单元格的公开指示器

swift - 'hideUISearchBarWhenScrolling'-属性不作为属性与 tableView 一起使用

ios - 不同模块中的相同类名

ios - startMonitoringSignificantLocationChanges 没有立即开始

objective-c - Xcode 找不到 ProductModuleName-Swift.h