Swiftui 如何定义接受任意数据元素并生成;“一些”;看法

Swiftui 如何定义接受任意数据元素并生成;“一些”;看法,swiftui,Swiftui,我正在构建一个显示字符串集合的自定义视图,但希望对其进行扩展,以接受一个闭包,该闭包将以不同的方式呈现这些字符串中的每一个,可能不会作为文本视图。例如,这是我的原始代码: struct MyCollectionView : View { var data : [String] var body : some View { ZStack { ForEach(0..<data.count, id: \.self) { string in Text(s

我正在构建一个显示字符串集合的自定义视图,但希望对其进行扩展,以接受一个闭包,该闭包将以不同的方式呈现这些字符串中的每一个,可能不会作为
文本
视图。例如,这是我的原始代码:

struct MyCollectionView : View {
  var data : [String]
  var body : some View {
    ZStack {
      ForEach(0..<data.count, id: \.self) { string in
        Text(string) // <- will try to invoke the closure here
      }
    }
  }
}
struct MyCollectionView:视图{
变量数据:[字符串]
var body:一些观点{
ZStack{

ForEach(0..这里是一种可能的方法。适用于Xcode 11.2和iOS 13.2

struct MyCollectionView<Data, Cell>: View where Data: Hashable, Cell: View {
    typealias CellRenderer = (Data) -> Cell
    var data : [Data]
    var cellRenderer : CellRenderer


    init(_ data: [Data], @ViewBuilder cellRenderer: @escaping CellRenderer) {
        self.data = data
        self.cellRenderer = cellRenderer
    }

    var body : some View {
        ZStack {
            ForEach(data, id: \.self) { value in
                self.cellRenderer(value)
            }
        }
    }
}


struct MyCollectionView_Previews: PreviewProvider {
    static var previews: some View {
        MyCollectionView(["one", "two"]) { value in
            Text(value)
        }
    }
}
struct MyCollectionView:视图,其中数据:可散列,单元格:视图{
typealias CellRenderer=(数据)->单元格
var数据:[数据]
var-cellRenderer:cellRenderer
init(data:[data],@ViewBuilder cellRenderer:@escaping cellRenderer){
self.data=数据
self.cellRenderer=cellRenderer
}
var body:一些观点{
ZStack{
ForEach(数据,id:\.self){中的值
self.cellRenderer(值)
}
}
}
}
结构MyCollectionView\u预览:预览提供程序{
静态var预览:一些视图{
MyCollectionView([“一”,“两”]){中的值
文本(值)
}
}
}
struct MyCollectionView<Data, Cell>: View where Data: Hashable, Cell: View {
    typealias CellRenderer = (Data) -> Cell
    var data : [Data]
    var cellRenderer : CellRenderer


    init(_ data: [Data], @ViewBuilder cellRenderer: @escaping CellRenderer) {
        self.data = data
        self.cellRenderer = cellRenderer
    }

    var body : some View {
        ZStack {
            ForEach(data, id: \.self) { value in
                self.cellRenderer(value)
            }
        }
    }
}


struct MyCollectionView_Previews: PreviewProvider {
    static var previews: some View {
        MyCollectionView(["one", "two"]) { value in
            Text(value)
        }
    }
}