我正试图在SwiftUI中为菜单视图创建一个视图 struct ,如下面的代码所示.我收到了一个错误:"未能生成表达式的诊断;请提交错误报告".我不明白我做错了什么.

为了清楚起见,我想创建一个 struct ,在这里我可以输入一个枚举、一个文本字符串和按钮的一个操作,然后返回一个菜单,以使contentview更具可读性.

希望你们能帮我.干杯

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

Swift相关问答推荐

如何将CodingKeys作为数组而不是枚举传递到类外部的函数中?

在按下按钮动画后执行按钮动作

了解SWIFT中的命名VS位置函数调用

如何在macOS中延迟退出应用程序的退出操作?

如何在设备(或常量)地址空间中创建缓冲区?

暂停我的 AR 会话并清除变量和锚点的功能

将 ArgumentParser 与 Swift 并发一起使用

防止带有背景的文本扩展到 maxWidth

如何在 UITableView 中点击图片和标题

Swift 根据总值将数组拆分为块

try 制作一个 Swift 扩展来替换字符串中的多次出现

如何使用 Swinject 注册符合 ObservableObject 的协议?

如何在 ZStack 中单独下移卡片?

任何使 ScrollView 像 List 一样执行更灵活的修饰符?

Vapor, fluent 使用 PostgreSQL 保存/创建复杂模型

Xcode 13.3 将函数调用更改为属性访问

无法分配给属性:self 是不可变的,我知道如何修复但需要理解

如何从元组数组创建字典?

如何轻松删除领域中的所有对象

Facebook SDK 4.0 IOS Swift 以编程方式注销用户