【问题标题】:Multiple enum types list all cases多个枚举类型列出所有案例
【发布时间】:2020-12-07 13:27:02
【问题描述】:

无法解决这个问题,也找不到任何答案,希望有人能指出我正确的方向。 我有多个枚举。一些例子(我有更多也更复杂的枚举):

enum Fish: String, CaseIterable, Displayable {
    case goldfish
    case blueTang = "blue_tang"
    case shark
}

enum Tree: String, CaseIterable, Displayable {
    case coconut
    case pine
    case englishOak = "english_oak"
}

我想在带有部分的列表中显示它们。我正在使用 swiftUI,但这可能并不重要。 我想实现一个功能,只要给我一个 Enum 类型就可以为我提供一个视图。

例如:

view(forType: Fish)

它应该看起来像:

func view(forType: Type) -> some View {
   VStack {
       Text(String(describing: Type.self))
       Type.allCases.forEach { case in
          ...
       }
    }
}

如果有人可以帮助我了解是否有一种方法可以概括 Enum 类型,我将非常感激!

【问题讨论】:

    标签: swift generics enums swiftui


    【解决方案1】:

    这是一个可能解决方案的演示。使用 Xcode 12.1 / iOS 14.1 准备

    enum Fish: String, CaseIterable {
        case goldfish
        case blueTang = "blue_tang"
        case shark
    }
    
    func view<T: CaseIterable & Hashable>(for type: T.Type) -> some View where T.AllCases: RandomAccessCollection {
        VStack(alignment: .leading) {
            Text(String(describing: type)).bold()
            ForEach(type.allCases, id: \.self) { item in
                Text(String(describing: item))
            }
        }
    }
    
    struct FishDemoView: View {
        var body: some View {
            view(for: Fish.self)
        }
    }
    

    【讨论】:

    • 老兄!你是救生员!正是我想要的。谢谢一百万!
    【解决方案2】:

    您必须将您的枚举声明为CaseIterable 才能使用allCases

    enum Fish: String, CaseIterable {
        case goldfish
        case blueTang = "blue_tang"
        case shark
    }
    

    我还没有跟上 SwiftUI/Combine 的速度,但这里是您在 Swift 中记录所有案例的方法:

    Fish.allCases.forEach() {
            print($0)
    }
    

    显示:

    goldfish
    blueTang
    shark
    

    【讨论】:

    • 感谢您的评论,我知道 CaseIterable,但我的意思是我想要一个可以接受任何枚举类型的函数。已更新。
    【解决方案3】:

    从我在这篇文章中可以看到: https://www.hackingwithswift.com/example-code/language/how-to-list-all-cases-in-an-enum-using-caseiterable

    您可以使枚​​举符合 CaseIterable 并执行类似的操作

    func view(forType: CaseIterable) -> some View
    

    或者

    func view<T: CaseIterable>(forType: T) -> some View
    

    P.S.:我还没有在 swiftUI 中工作过,所以我不确定泛型是否有效

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 2015-11-16
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多