以不透明的方式访问Swift Enum数组中的关联值

问题描述 投票:0回答:2

我还没有真正找到相关问题中需要的东西。那可能是因为我有点厚,没看到它,但这是我的困惑:

我有一个计算属性,该属性返回带有关联值的枚举数组。

这些值都是相同的类型(在我的用例中,该类型是一个“标志”,但是枚举不同。

我想看看是否有某种方法可以遍历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语句来完成所有枚举值(第二遍),但是如果有一些通用的方法可以访问所有值,那就太好了。

swift enums switch-statement
2个回答
1
投票

您仍然必须针对每种情况进行测试,但是您可以这样做

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

0
投票

我建议对您的枚举进行一些修改:

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.