Начиная со Swift 5.5 мы могли создавать списки SwiftUI с такими привязками (например, см. этот ответ):
class Item {
// ...
var isOn: Bool
}
struct ContentView: View {
@State private var items: [Item] = []
var body: some View {
NavigationView {
List {
ForEach($items) { $item in // <--- list binding
Toggle(isOn: $item.isOn) {
Text("Vibrate on Ring")
}
}
}
}
}
}
Теперь я хочу сделать что-то подобное со SwiftData, но получаю сообщение об ошибке:
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item]
var body: some View {
NavigationView {
List {
ForEach($items) { $item in // <--- Cannot find '$items' in scope
// ...
Как я могу отобразить список объектов SwiftData, который позволяет встроенное редактирование объектов через привязки?





Самое простое решение, которое я нашел, — использовать @Bindable и разделить макрос Query и Bindable на разные представления.
Пример
struct ItemRow: View {
@Bindable var item: Item
var body: some View {
HStack {
Text(item.name)
Toggle(isOn: $item.isOn) // Notice the $
}
}
}
Вызов просмотра
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item]
var body: some View {
NavigationView {
List {
ForEach(items) { item in
ItemRow(item: item)
//...
}
Вы можете использовать новый Bindable, который имеет оператор нижнего индекса для переноса базовых данных в переменную привязки:
ForEach(items) { item in
Toggle(isOn: Bindable(item).isOn) { ... }
}
Ответ заминусован. Было бы здорово, если бы downvoter мог сообщить мне, если это не сработало или если объяснение было неясным.
Правильно, это даже в документах, хотя и на 2 строчке вместо 1.
Вы должны использовать Bindable с новыми фреймворками.