У меня есть простой запрос SwiftData, в котором хранится массив проектов. Я хочу передать этот массив в пользовательское представление под названием «ProjectView», но получаю сообщение об ошибке, что оно не находит $projects в области видимости. Если я могу использовать запрос только как чтение, какова вообще цель SwiftData? Вот мой код:
import SwiftUI
import SwiftData
struct FileModel: Identifiable, Codable, Equatable {
var id = UUID()
var fileName: String
var tempName: String = ""
var persistent = false
var data: Data?
var subFiles: [FileModel] = []
var isDirectory: Bool {
return data == nil || subFiles.isEmpty == false
}
var isExpanded = true
var isRenaming = false
var isDeleting = false
}
@Model class Project {
var id = UUID()
var name: String = ""
var created: String = ""
var lastModified: String = ""
var files: [FileModel] = []
init() {
self.name = "New Project"
self.created = Date.now.formatted(date: .numeric, time: .shortened)
self.lastModified = created
self.files = [
FileModel(fileName: "root", persistent: true)
]
}
}
struct ProjectView: View {
@Binding var projects: [Project]
var body: some View {
ScrollView {
VStack {
ForEach($projects) { $project in
TextField("Project Name", text: $project.name)
.padding()
.textFieldStyle(RoundedBorderTextFieldStyle())
}
}
.padding()
}
}
}
struct ContentView: View {
@Query var projects: [Project]
@Environment(\.modelContext) var modelContext
@State private var selectedProjectID: UUID?
var body: some View {
VStack {
Text("Hello, world!")
ProjectView(projects: $projects)
.padding()
}
.padding()
}
}
#Preview(windowStyle: .automatic) {
ContentView()
}
Можно ли как-то передать проекты как значения среды чего-л. Я новичок в SwiftData и уже столкнулся с ошибкой, которую не могу исправить. Заранее спасибо!





@Binding предназначен для типов значений, для @Model вам нужно @Bindable для каждой модели, поэтому измените
@Binding var projects: [Project]
К
let projects: [Project]
И отрегулируйте ForEach, чтобы
ForEach(projects) { project in
@Bindable var project = project
Кажется, это работает! попробую через некоторое время