如何使用SwiftUI使此ForEach函数起作用?

时间:2019-09-04 15:30:46

标签: list foreach swiftui hashable

我正在尝试遵循此聊天应用程序教程,并且ForEach函数的语法已在SwiftUI中更新。您能帮我使用SwiftUI成功编译此列表吗?

path = "C://Program Files//Microsoft SQL Server//Client 
SDK//ODBC//130//Tools//Binn//" #make sure to use forward slash
program = "bcp.exe"
os.chdir(path)
os.system(program)

我尝试将ForEach更改为更新的语法:

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)
            }
        }
    }
}

但是,我收到一条错误消息: “无法推断复杂的闭包返回类型;添加显式类型以消除歧义”

2 个答案:

答案 0 :(得分:2)

@dfd已经在上面的评论中回答了您。这里的问题与bind()视图无关(请注意以下重要事项: ForEach不是函数,是ForEach ,它是完全不同的从View开始,您在Swift中就已经习惯了)。

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

Text

答案 1 :(得分:-1)

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"))

        }

    }

}