通用枚举菜单 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
})
我正在尝试在 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
})