Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何使用SwiftUI使此ForEach函数工作?_List_Foreach_Swiftui_Hashable - Fatal编程技术网

List 如何使用SwiftUI使此ForEach函数工作?

List 如何使用SwiftUI使此ForEach函数工作?,list,foreach,swiftui,hashable,List,Foreach,Swiftui,Hashable,我正在尝试跟随这个聊天应用教程,ForEach函数的语法已经在SwiftUI中更新。你能帮我用SwiftUI成功编译这个列表吗 import SwiftUI struct ChatMessage : Hashable { var message: String var avatar: String } struct ContentView : View { var messages = [ ChatMessage(message: "Hello wor

我正在尝试跟随这个聊天应用教程,ForEach函数的语法已经在SwiftUI中更新。你能帮我用SwiftUI成功编译这个列表吗

import SwiftUI

struct ChatMessage : Hashable {
    var message: String
    var avatar: String
}

struct ContentView : View {
    var messages = [
        ChatMessage(message: "Hello world", avatar: "A"),
        ChatMessage(message: "Hi", avatar: "B")
    ]

    var body: some View {
        List {
            ForEach(messages.identified(by: \.self)) {
                Text($0.avatar)
                Text($0.message)
            }
        }
    }
}
我尝试将ForEach更改为更新的语法:

var body: some View {
        List {
            ForEach(messages, id: \.self) {
                Text($0.avatar)
                Text($0.message)
            }
        }
    }
但是,我收到一条错误消息:
无法推断复杂的闭包返回类型;添加显式类型以消除歧义

@dfd已经在上面的评论中回答了您。这里的问题与ForEach视图无关,请注意这一点:ForEach不是一个函数,而是一个视图,它与您在Swift中使用的ForEach完全不同

ForEach视图逐个获取数组中的元素,并为每个元素构建一个视图。在@ViewBuilder闭包中,在ForEach之后,您正在传递多个视图。您必须根据需要将两个文本包装在一个视图中。例如,如果希望文本垂直堆叠,则必须执行以下操作:

struct ChatMessage : Hashable {
    var message: String
    var avatar: String
}

struct ContentView : View {
    var messages = [
        ChatMessage(message: "Hello world", avatar: "A"),
        ChatMessage(message: "Hi", avatar: "B")
    ]

    var body: some View {
        List {
            ForEach(messages, id: \.self) {val in
                VStack {
                    Text(val.avatar)
                    Text(val.message)
                }
            }
        }
    }
}

在HStack或VStack中嵌入两个文本视图。基本上,您的ForEach就像创建一个表单元格。在基本视图中,不能只放置两个没有某种堆栈的文本子视图,在ForEach中也不能。我知道我很讨厌,但正如我在回答中所说的,在你的问题中有一个很大的错误:ForEach不是一个函数,它是一个实现视图协议的结构。这对于理解SwiftUI的工作原理非常重要。
struct ContentView: View {

    @State var showFavoritesOnly = true

    var body: some View {

        NavigationView {

            List {

                ForEach(landmarkData) { landmark in

                    if !self.showFavoritesOnly || landmark.isFavorite {

                        NavigationLink(destination: UserDetail(landmark: landmark)) {

                            UsersList(landmark: landmark)

                        }

                    }

                }

            }

            .navigationBarTitle(Text("Users"))

        }

    }

}