在 SwiftUI 中填充列表

Populating a List in SwiftUI

Swift 初学者相当多,通过在线教程自学。所以我正在创建列表视图,列表视图的数据(数组)保存在一个单独的 Swift 文件中。

在下面的代码中,导入数组中的数据并使用列表语法和闭包填充列表。我的问题是 Swift Closure 如何帮助填充这些数据,逐步解释可能会有所帮助。随着我在课程中的进一步发展,我面临着理解上的挑战。

import SwiftUI

struct ContentView: View {

    let hikes = Hike.all()  //all the data kept in separate Swift file

    var body: some View {
        List(self.hikes, id: \.name) { hike in  //how does closure help here?  
            Text(hike.name)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

这是一个相当抽象的解释。

什么是List

A List 是一个可以表示您的模型列表的视图(在本例中,self.hikes。不过我没有在任何地方看到这个声明,您的意思是 self.imgs?)。您的每个模型都表示为 List.

的 "subview"

什么是闭包?

闭包实际上只是一个函数。它可以接受任意数量的参数,并且可以选择 return 一个值。

那么这里为什么要用闭包呢?

List实际上不知道如何将你的每个模型表示为View,所以它需要问。它使用一个闭包来完成此操作,该闭包将您的模型之一作为参数,并且 returns a View。这样一来,每当 List 想问 "How should I represent this model?" 问题时,它只需调用闭包,就会得到一个 View.

在您的例子中,您说过要表示您的模型之一 hikeList 应该使用带有字符串 hike.nameText 视图。

换句话说,你在这里传入的闭包代表了你的模型和显示你模型的视图之间的映射。

注意:您在此处使用的闭包实际上是一种特殊类型的闭包,称为函数生成器。如果您有兴趣,请阅读更多内容here

来自您的评论:

does the variable hike loops in like "For-In" loop till all the values are printed

嗯,它不一定像 for-in 循环那样工作。这真的完全取决于List的实施。 "when will the closure be called?" 的答案是 "when the List needs a view".