我还没有真正找到相关问题中需要的东西。那可能是因为我有点厚,没看到它,但这是我的困惑:
我有一个计算属性,该属性返回带有关联值的枚举数组。
这些值都是相同的类型(在我的用例中,该类型是一个“标志”,但是枚举不同。
我想看看是否有某种方法可以遍历Array,仅查看关联的值,而与枚举类型无关。我正在附上一个小操场,上面写着我的意思:
enum A {
case valueA(Int)
case valueB(Int)
case valueC(Int)
}
let a: [A] = [.valueA(0), .valueB(1), .valueC(2)]
for each in a {
print(String(describing: each))
}
print();
// This works:
for each in a {
if case let .valueA(value) = each {
print(value)
}
if case let .valueB(value) = each {
print(value)
}
if case let .valueC(value) = each {
print(value)
}
}
print();
// So does this:
for each in a {
var value: Int = 0
switch each {
case .valueA(let val):
value = val
case .valueB(let val):
value = val
case .valueC(let val):
value = val
}
print(value)
}
// What I want:
//for each in a {
// if case let A(value) = each {
// print(value)
// }
//}
我希望能够处理集合的每个成员,并提取其标志,然后根据该标志做出决定。
[我知道我可以用一个大的ol'switch语句来完成所有枚举值(第二遍),但是如果有一些通用的方法可以访问所有值,那就太好了。
您仍然必须针对每种情况进行测试,但是您可以这样做
enum A {
case valueA(Int)
case valueB(Int)
case valueC(Int)
}
let a: [A] = [.valueA(0), .valueB(1), .valueC(2)]
for each in a {
switch each {
case .valueA(let val), .valueB(let val), .valueC(let val):
print(val)
}
}
我建议对您的枚举进行一些修改:
enum A {
case valueA(Int)
case valueB(Int)
case valueC(Int)
var flag: Int {
switch self {
case .valueA(let flag),
.valueB(let flag),
.valueC(let flag):
return flag
}
}
}
这使得任何只需要标志的循环都是简单的:
for each in a {
print(each.flag)
}