SwiftUI 中的 List 和 ForEach 有什么区别?

What is the difference between List and ForEach in SwiftUI?

我知道 SwiftUI 目前不支持常规的 for 循环,而是提供了一种叫做 ForEach 的东西,但它和 List 有什么区别?

  • ForEach 是一个视图,它允许您将数据集合传递给它的初始化程序,然后从您提供的闭包中创建多个“子视图”。它没有关于如何排列视图的任何语义。

    示例:

      ForEach(1..<5) { row in
          Text("Row \(row)")
      }
    

    将创建等效关闭

      Text("Row 1")
      Text("Row 2")
      Text("Row 3")
      Text("Row 4")
    

    包装在单个容器视图中。

  • List是可以将多个视图组合在一起的视图,但不一定是同一类型的视图。您可以简单地添加多个视图而无需任何循环。

    示例 1:

      List {
          Image("avatar")
          Text("Title")
          Button(action: {
              print("Button tapped!")
          }) {
              Text("Energize!")
          }
      }
    

    作为便利List 初始化程序允许您像使用 ForEach 视图一样使用它,以防您想要一个包含以下内容的列表只有一种细胞类型。

    示例 2:

      List(1..<5) { row in
          Text("Row \(row)")
      }
    

    列表具有特殊外观,具体取决于平台。例如,在 iOS 上,列表将显示为 table 视图,并在其垂直堆叠的视图之间插入分隔线。

    您可以在 List 视图中使用 ForEach 视图来同时拥有动态和静态内容 – SwiftUI.[=48= 的一个非常强大的功能]

    示例 3:

      List {
          Text("Food")
          ForEach(meals) { meal in
              Text(meal.name)
          }
          Text("Drinks")
          ForEach(drinks) { drink in
              Text(drink.name)
          }
      }
    

SwiftUI 列表与 ForEach

List:

  • 混合内容(也允许使用集合)
  • 可滚动
  • 使用重用单元格模式(高效)

ForEach:

  • 仅适用于集合

List + ForEach = 超级功能。在这种情况下,例如,List 对来自 ForEach 的每个视图使用重复使用的单元格模式。您也可以使用 onMoveonDelete...

简单说明:

  • List 的行为类似于 UIScrollView(任意长的可滚动视图 的意见)
  • ForEach 的行为有点像 UITableView(其中每个元素都有一个单元格视图,并且它也是可滚动的)