Tenho um modelo SwiftData como este:
@Model class LogInfo {
var tagValue: String
...
}
Quero exibir uma lista de todos os objetos LogInfo para os quais o tagValue está contido em um array. A visualização do SwiftUI se parece com isso:
struct LogListView: View {
@Query
private var logs: [LogInfo]
init(tagsToFilter: [LogTag]) {
_logs = Query(filter: #Predicate<LogInfo> { logInfo in
if tagsToFilter.isEmpty || tagsToFilter.contains(where: { tag in
tag.rawValue == logInfo.tagRawValue
}) {
true
} else {
false
}
})
}
O tagsToFilter
argumento será todas as tags selecionadas pelo usuário (multi seleção). O LogTag
objeto é um enum, declarado desta forma:
public enum LogTag: String, Codable, CaseIterable, Hashable, Identifiable
Como a consulta não me deixa verificar diretamente o enum sem travar, eu "dobrei" as informações com o rawValue. Então, estou criando o LogListView assim: LogListView(tagsToFilter: [.case1, .case2])
. Quero que a lista exiba todos os objetos LogInfo que tenham o valor bruto da tag "case1" ou "case2" neste exemplo.
A Query funciona quando tenho uma lista vazia, ou se eu remover a query completamente. Mas o predicado não filtra nada. Eu tentei um predicado mais simples, como:
#Predicate<LogInfo> { logInfo in
tagsToFilter.contains(where: { tag in
tag.rawValue == logInfo.tagRawValue
}
}
mas isso retorna uma lista vazia.
Estou entendendo errado ou é outra limitação do SwiftData?
Experimente esta abordagem usando uma
Predicate
consulta separadatagStrings
em vez de tentar usar uma consulta dinâmica com tudo dentro dela.Código de exemplo.