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}}}
是的,看起来不错!此外,您的直截了当的解决方案似乎是一个很好的解决方案。非常感谢。