Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何从嵌套枚举中获取所有值?_Swift - Fatal编程技术网

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

Swift 如何从嵌套枚举中获取所有值?,swift,Swift,使用键/值字符串文件,我正在寻找一种更简单的方法,通过将枚举传递到函数中来提取值,该函数执行查找并返回该值 此字符串文件可以通过网络更新,因此我的应用程序附带默认版本。目前,为了将这些默认值存储到内存中,我迭代了我的枚举案例,并将字符串添加到字典中 看起来是这样的: enum StringKeys: String, CaseIterable { case string1 case string2 case string3 } func setupDefaults() {

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

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

看起来是这样的:

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
   }
}

这一切已经好了一段时间了,但是这个枚举变得相当大,所以自动完成的帮助不大

我想要的是更像这样的东西:

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
   }
}

然后使用以下命令调用my
getValue
函数:

titleLabel.text = Strings.getValue(for: StringKeys.Feature1.title1)
这也很好,但我不知道如何迭代这些嵌套键,以一种干净的方式构建默认字典

我尝试扩展
CaseIterable
以添加一点
allcasesrescursive
函数。斯威夫特不允许的

我知道这可以通过在每个枚举中添加属性来实现,返回
allCases
,并在每个父级将它们组合在一起。但这仍然有点混乱

另一种选择是不使用枚举来设置默认值,而只是解析整个文件并将其直接放入默认值,但我更希望枚举决定默认值中的内容。这还可以很容易地查看是否缺少任何密钥,也就是说,找不到该密钥的默认值,并且我可以抛出一个错误

所以,基本上我想把一堆嵌套的枚举转换成一个平面字典。即使只是一组钥匙也足以让我走完剩下的路。是否可以递归地向下钻取嵌套枚举?我可以用反射来解决这个问题吗


我对其他想法也持开放态度,否则我将坚持使用巨型扁平枚举。

我不知道我是否正确理解您的问题,也许这会有所帮助

//创建协议
协议StringKeyValue{}
枚举StringKeys:可大小写{
枚举功能1:字符串、CaseIterable、StringKeyValue{
案例标题1
箱子按钮1
}
枚举功能2:字符串、CaseIterable、StringKeyValue{
案例标题3
案例切换1
}
}
func getValue(用于:StringKeyValue)->String{
返回“你好”
}
//也许这就是你想要的?
titleLabel.text=getValue(用于:StringKeys.Feature1.title1)

我不知道我是否正确理解了你的问题,也许这会有所帮助

//创建协议
协议StringKeyValue{}
枚举StringKeys:可大小写{
枚举功能1:字符串、CaseIterable、StringKeyValue{
案例标题1
箱子按钮1
}
枚举功能2:字符串、CaseIterable、StringKeyValue{
案例标题3
案例切换1
}
}
func getValue(用于:StringKeyValue)->String{
返回“你好”
}
//也许这就是你想要的?
titleLabel.text=getValue(用于:StringKeys.Feature1.title1)

字符串的参数类型是什么。getValue?注意:它不能是
StringKeys
,因为这样您就不能向它传递任何内容,因为
StringKeys
实际上没有任何案例。它也不能是
Feature1
/
Feature2
,因为这样你就不能将
Feature2
/
Feature1
的案例传递给它。如果你最终还是想要一个密钥数组,为什么不将密钥存储在一个json文件中,然后在需要时加载到主捆绑包中。您还有几行代码要读取和解码连接文件,但在这之后,您的代码应该非常干净,只有一个数组可以使用。尝试限制添加新键/值时需要触摸的区域数量。也许构建脚本可以根据嵌套枚举中的任何内容创建这个json文件。只需查找所有的“案例”行。。。嵌套结构会更好吗?您可以在这些中迭代静态属性吗?
Strings.getValue
的参数类型是什么?注意:它不能是
StringKeys
,因为这样您就不能向它传递任何内容,因为
StringKeys
实际上没有任何案例。它也不能是
Feature1
/
Feature2
,因为这样你就不能将
Feature2
/
Feature1
的案例传递给它。如果你最终还是想要一个密钥数组,为什么不将密钥存储在一个json文件中,然后在需要时加载到主捆绑包中。您还有几行代码要读取和解码连接文件,但在这之后,您的代码应该非常干净,只有一个数组可以使用。尝试限制添加新键/值时需要触摸的区域数量。也许构建脚本可以根据嵌套枚举中的任何内容创建这个json文件。只需查找所有的“案例”行。。。嵌套结构会更好吗?您可以在这些集合中迭代静态属性吗?希望在一个集合中可以使用枚举中的所有键进行迭代。这是不相关的。是的,所以我已经有了一个包含所有默认值的文件,但我不只是将它们直接加载到内存中,我只想加载我用枚举(键)覆盖的那些,你在那里所做的就是我想要得到的,我正在努力解决的是更扁平的嵌套枚举位。OP希望枚举中的所有键都可以在一个集合中使用,以便进行迭代。这是不相关的。是的,所以我已经有了一个包含所有默认值的文件,但我不只是将它们直接加载到内存中,我只想加载我用枚举(键)覆盖的那些,你在那里所做的就是我想要得到的,我正在努力解决的是更扁平的嵌套枚举位。