Recebo o erro abaixo ao tentar iniciar uma consulta SwiftData em uma exibição:
Error: Cannot convert value of type 'PredicateExpressions.Equal<PredicateExpressions.KeyPath
<PredicateExpressions.Variable<Array<Todo>.Element>, Int>, PredicateExpressions.KeyPath<PredicateExpressions.Value<Section>,
Int>>'(aka'PredicateExpressions.Equal<PredicateExpressions.
KeyPath<PredicateExpressions.Variable<Todo>, Int>, PredicateExpressions.KeyPath<PredicateExpressions.Value<Section>,
Int>>') to closure result type 'any StandardPredicateExpression<Bool>'
TodoView.swift
import SwiftUI
import SwiftData
struct TodoView: View {
@Query var todos: [Todo]
@EnvironmentObject var currentSection: Section
@Environment(\.modelContext) var modelContext
var DWMY = ["D","W","M","Y"]
var body: some View {
List {
ForEach(todos) { todo in
HStack {
if todo.completed == false {
Text("[ ]")
} else {
Text("[X]")
}
Text(todo.name)
Text(DWMY[todo.section])
}
}
.onDelete(perform: deleteToDo)
}
.navigationBarTitleDisplayMode(.inline)
}
init(todoSection: Section) {
_todos = Query(filter: #Predicate { todo in
todo.section == currentSection.section
})
}
func deleteToDo(at offsets: IndexSet ) {
for offset in offsets {
let todo = todos[offset]
modelContext.delete(todo)
}
}
}
O erro ocorre quando tento dar à consulta o valor currentSection.section
que se eu substituir por um IntcurrentSection.section
codificado não há erros.
Pelo que li, isso acontece porque meu ambiente não é passado ToDoView.swift
até que o corpo seja criado, então currentSection.section
ele não existe quando init
isso acontece.
Qual é a maneira correta de passar meu currentSection.section
valor para init
?
Eu não faria
TodoView
depender do objeto de ambiente para criar oQuery
. Tenha oinit
take no número da seção.Então pegue
EnvironmentObject
na visualização pai: