List 如何使用SwiftUI使此ForEach函数工作?
我正在尝试跟随这个聊天应用教程,ForEach函数的语法已经在SwiftUI中更新。你能帮我用SwiftUI成功编译这个列表吗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
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"))
}
}
}