通用枚举菜单 SwiftUI

Generic enum Menu SwiftUI

我正在尝试在 SwiftUI 中为菜单视图创建一个视图结构,如下面的代码所示。我收到错误消息“无法为表达式生成诊断;请提交错误报告”。我不明白我做错了什么。

明确地说,我想创建一个结构,我可以在其中输入一个枚举、一个文本字符串和一个按钮操作,然后返回一个菜单,以使内容视图更具可读性。

希望大家能帮帮我。干杯。

struct AddObjectMenuView<T: RawRepresentable, CaseIterable>: View {
    
    let labelText: String
    let someEnum: T
    let function: () -> Void
    
    var body: some View { // Getting error here
        Menu {
            ForEach(someEnum.allCases) { field in
                Button(action: function) {
                    VStack {
                        Text(field.rawValue).padding()
                    }
                }
            }
        } label: {
            Text(labelText).padding().background(RoundedRectangle(cornerRadius: 10).foregroundColor(.clear))
        }
        .foregroundColor(Color("lightBlue"))
    }
    
}

然后像这样在我的 ContentView 中使用它:

        AddObjectMenuView(labelText: "Hello", someEnum: SomeEnum, function: {
            // Do something
        })

您需要使用泛型类型才能使用 .allCases

这是固定的变体(修改的部分内联突出显示)。使用 Xcode 13.2 / iOS 15.2

测试
struct AddObjectMenuView<T: CaseIterable & Hashable> : View where T.AllCases: RandomAccessCollection {

    let labelText: String
    let someEnum: T.Type     // << here !!
    let function: () -> Void

    var body: some View {
        Menu {
            ForEach(someEnum.allCases, id: \.self) { field in   // << here !!
                Button(action: function) {
                    VStack {
                        Text(String(describing: field)).padding()  // << here !!
                    }
                }
            }
        } label: {
            Text(labelText).padding().background(RoundedRectangle(cornerRadius: 10).foregroundColor(.clear))
        }
        .foregroundColor(Color("lightBlue"))
    }
}

当然枚举也要相应确认。

和用法类似

AddObjectMenuView(labelText: "Hello", someEnum: SomeEnum.self, function: {
    // Do something
})