Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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_Xcode_Switch Statement_Associated Value - Fatal编程技术网

Swift 展开开关中所有案例的关联值

Swift 展开开关中所有案例的关联值,swift,xcode,switch-statement,associated-value,Swift,Xcode,Switch Statement,Associated Value,我有一个与此类似的枚举,其中所有案例都包含相同的关联值内容: 枚举行类型{ 单格(uu内容:[任何]) 双格(u内容:[任何]) 大小写三元组(u内容:[任何]) ... } 我知道我可以使用带有rowType和content属性的struct,但请不要讨论这一点,而是看一下以下内容: 当我想切换所有案例时,我当然可以这样做: 切换行{ 案例。单个(让内容): //做任何事 打破 双格(让内容): // ... ... } 甚至: 切换行{ case.single(let内容),.doubl

我有一个与此类似的枚举,其中所有案例都包含相同的关联值
内容

枚举行类型{
单格(uu内容:[任何])
双格(u内容:[任何])
大小写三元组(u内容:[任何])
...
}
我知道我可以使用带有
rowType
content
属性的
struct
,但请不要讨论这一点,而是看一下以下内容: 当我想切换所有案例时,我当然可以这样做:

切换行{
案例。单个(让内容):
//做任何事
打破
双格(让内容):
// ...
...
}
甚至:

切换行{
case.single(let内容),.double(let内容),…:
//对所有情况都执行相同的操作
打破
}
现在,我的enum包含了更多的案例,并且在开发过程中可能会进一步增长,因此我很不方便在同一个
case
语句中列出所有案例,只需打开
content
参数

因此,我感到好奇和疑惑:我是否可以以某种方式“通配符”枚举大小写本身,并仍然打开
内容
字段?
就像
默认值
大小写一样

我希望能做一些像这样的事

切换行{
案例(内容):
//做点什么
打破
}
。。。或者在默认情况下访问关联的值


我做了一些研究,但找不到答案,所以我很期待你们的想法。

在操场上试试这个

enum RowType {
case single(_ content: [Any])
case double(_ content: [Any])
case triple(_ content: [Any])
case noVal

var associatedValue: Any? {
    get {
        let mirror = Mirror(reflecting: self)
        if let associated = mirror.children.first {
            return  associated.value
        }
        print("WARNING: Enum option of \(self) does not have an associated value")
        return  nil
    }
  }
}

let row : RowType = .double([1,2,3])
let rowNoVal : RowType = .noVal
row.associatedValue
rowNoVal.associatedValue

这样的特征并不存在。使用具有rowType和content属性的结构将是正确的方法。一个可能的解决方案是向枚举中添加一个计算属性,该属性包含一个开关,然后返回您的属性。内容。您仍然需要包含所有可能的值,但只能包含一次。现在不可能,因为每个案例都可能包含不同类型的关联值(或者根本没有),并且编译器无法用一个单独的实例处理所有这些值wildcard@MichaelSalmon啊,那真是个好主意!谢谢分享@RicoCrescenzio是的,可以,但我不能告诉他依靠它,比如强制展开枚举值吗?类似于“每当我可以打开类型为
[Any]
的关联值时”的情况。我的意思是,它仍然是一个开关,提供了一个默认子句作为回退。。。你知道我的意思吗?实际上效果很好,谢谢分享!你能想出一个“更安全”的变体吗,比如没有镜子?我在搜索没有镜子的更安全的变体@Muli。(你可以从我这里的问答中看到这一点。)下面是一个尝试,注意在静态情况下,rawValues可以代替它。否则我只能想到这样一个简单的解决方案,@Muli:
var associatedValue:Any?{get{switch self{case.single(let content),.double(let content),.triple(let content):返回内容默认值:return nil}}}
是的,看起来不错!此外,您的直截了当的解决方案似乎是一个很好的解决方案。非常感谢。