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

Ché*_*éyo 13 swiftui

我知道SwiftUI目前不支持常规的for循环,而是提供了一个称为ForEach的东西,但是和List之间有什么区别?

Mis*_*cha 28

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

    例:

    ForEach(1...5) { row in
        Text("Row \(row)")
    }
    
    Run Code Online (Sandbox Code Playgroud)

    将创建等效的

    Text("Row 1")
    Text("Row 2")
    Text("Row 3")
    Text("Row 4")
    Text("Row 5")
    
    Run Code Online (Sandbox Code Playgroud)

    包装在单个容器视图中。

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

    范例1:

    List {
        Image("avatar")
        Text("Title")
        Button(action: {
            print("Button tapped!")
        }) {
            Text("Energize!")
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    方便起见,如果您要具有仅由单个单元格类型组成的列表,则List初始化器允许您像ForEach视图一样使用它。

    范例2:

    List(1...5) { row in
        Text("Row \(row)")
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    您可以在ForEach视图内部使用视图List来具有动态和静态内容,这是SwiftUI的一项非常强大的功能。

    范例3:

    List {
        Text("Food")
        ForEach(meals) { meal in
            Text(meal.name)
        }
        Text("Drinks")
        ForEach(drinks) { drink in
            Text(drink.name)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 好答案。一些调整:1.您不需要大多数这些“返回”([SE-255](https://github.com/apple/swift-evolution/blob/master/proposals/0255-omit-return。 md),哟)。而且,如果您只是将字符串传递给Text(...),则无需将其包装在字符串插值中-SwiftUI会自动使程序化字符串不本地化,并对文字和插值进行本地化。 (7认同)
  • 能详细介绍一下表演吗?哪一种重复利用细胞更好?对于连续馈送类型的数据集,应该首选哪一个? (4认同)

yoA*_*ex5 14

SwiftUI 列表与 ForEach

List:

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

ForEach:

  • 仅适用于集合

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


m0b*_*0bl 9

简单解释:

  • List 的行为有点像UITableView(其中每个元素都有一个单元格视图,并且它也是可滚动的)。
  • ForEach 的行为类似于视图的for 循环;它展开视图集合,但不添加任何其他行为。
    • 它经常在UIScrollView内部使用来添加滚动
    • 和/或 HStack 或 VStack 来控制布局方向。

  • 对于使用旧方法的用户来说,这是一种将其等同于 UIKit 的有用方法。小问题,但我认为是相反的:List 的行为类似于 UITableView,ForEach 的行为类似于 UIScrollView。我测试了两者,ForEach 本身只显示重复的文本视图,而 List 显示带有边框的单元格。 (5认同)