SwiftUI嵌套ForEach循环报错:无法将[Document]转为Binding<C>
嵌套ForEach循环报错:Cannot convert value of type '[Document]' to expected argument type 'Binding'
问题描述
在嵌套ForEach循环中触发错误:Cannot convert value of type '[Document]' to expected argument type 'Binding
相关代码
Model
import Foundation struct Publisher: Identifiable { var id = UUID() var username: String var documents: [Document] } struct Document: Identifiable { var id = UUID() var title: String var description: String var username: String var userImage: String var text: String var date: Date }
ViewModel
import Foundation final class PublisherViewModel: ObservableObject { @Published var publishers = [ Publisher( username: "blah", documents: [Document( title: "Blah Strikes Again", description: "How Blahs Work", username: "blah", userImage: "blah", text: "Enim porro et eius et. Recusandae nisi aperiam tenetur dolore ut ratione. Repudiandae quas sit est molestiae exercitationem non sequi et.", image: "", audio: "", video: "", date: Date()) ] }
View
import SwiftUI struct PublisherDetailView: View { @ObservedObject var viewModel = PublisherViewModel() var body: some View { HStack { ForEach(viewModel.publishers) { publisher in ForEach(publisher.documents) { document in // <-- **error here** Text(document.content) .padding() Spacer() } } } } }
问题原因及解决方法
你遇到的Binding错误属于编译器误报,根源是代码中存在多处语法和逻辑错误:
- 属性不匹配:View中访问
document.content,但Document结构体仅定义了text属性,不存在content; - 结构体初始化参数冗余:ViewModel中初始化
Document时传入了image、audio、video参数,但Document结构体未定义这些属性; - 语法结构未闭合:ViewModel中
publishers数组、Publisher及Document的初始化都缺少闭合的括号/大括号,导致代码无效。
修复这些错误后,ForEach的嵌套遍历会正常工作(因为Publisher和Document都遵循Identifiable协议,SwiftUI的ForEach支持直接遍历这类数组)。
修正后的完整代码
修正后的Model
import Foundation struct Publisher: Identifiable { var id = UUID() var username: String var documents: [Document] } struct Document: Identifiable { var id = UUID() var title: String var description: String var username: String var userImage: String var text: String var date: Date }
修正后的ViewModel
import Foundation final class PublisherViewModel: ObservableObject { @Published var publishers = [ Publisher( username: "blah", documents: [Document( title: "Blah Strikes Again", description: "How Blahs Work", username: "blah", userImage: "blah", text: "Enim porro et eius et. Recusandae nisi aperiam tenetur dolore ut ratione. Repudiandae quas sit est molestiae exercitationem non sequi et.", date: Date() )] ) ] }
修正后的View
import SwiftUI struct PublisherDetailView: View { @ObservedObject var viewModel = PublisherViewModel() var body: some View { HStack { ForEach(viewModel.publishers) { publisher in ForEach(publisher.documents) { document in Text(document.text) .padding() Spacer() } } } } }
内容的提问来源于stack exchange,提问作者somethingsomethingswift
相关产品推荐
相关产品推荐

