我正在尝试基于枚举字符串创建 SwiftUI 列表。我面临这个错误:
Cannot invoke initializer for type 'List<_, _>' with an argument list of type '([HomeView.Data], @escaping (String) -> HomeMenuRow)'
我不明白如何使用 id 或如何迭代枚举来构建一行。
试试这个:
enum Whatever : String, CaseIterable, Identifiable {
var id : String { UUID().uuidString }
case one = "one"
case two = "two"
}
struct ContentView: View {
var body: some View {
VStack {
List (Whatever.allCases) { value in
Text(value.rawValue)
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
您在这里不需要可识别身份。我也添加了选择,因为为什么不呢:
enum Whatever: String, CaseIterable {
case one
case two
}
struct ContentView: View {
@Binding var selection: Whatever?
var body: some View {
VStack {
List (Whatever.allCases, id: \.rawValue, selection: $selection) { item in
Text(item.rawValue)
.tag(item)
}
}
}
}
选择必须是可选的(这里的错误消息并没有太大帮助),但这基本上就是获取更改枚举值的列表的方式。您还可以使用它进行类型擦除,以在侧边栏中显示不同数据类型的子列表(例如书籍、杂志、视频):使用带有关联数据的枚举,按枚举情况分组,然后享受吧。 id 不一定是静态属性;如果您的情况是
one(content: Book)
您可以使用 switch 语句和 case one(let book): return book.id
计算出 id 属性,并且只需使用 id: .id 键路径。 (除非 Swift 5 中的其他地方,否则 return 关键字仍然是必需的)。
A
ForEach
元素需要绑定,因此我尝试的另一个选择是在 .constant
中使用 ForEach
。这确实意味着您可能必须使用 item.wrappedValue
来访问属性。
ForEach(.constant(Whatever.allCases)) { item in
Text(item.wrappedValue.rawValue
}