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
}
}
然后使用以下命令调用mygetValue
函数:
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希望枚举中的所有键都可以在一个集合中使用,以便进行迭代。这是不相关的。是的,所以我已经有了一个包含所有默认值的文件,但我不只是将它们直接加载到内存中,我只想加载我用枚举(键)覆盖的那些,你在那里所做的就是我想要得到的,我正在努力解决的是更扁平的嵌套枚举位。