我有一个这样的 SwiftData 模型:
@Model class LogInfo {
var tagValue: String
...
}
我想要显示所有 LogInfo 对象的列表,这些对象的 tagValue 包含在数组中。SwiftUI 视图如下所示:
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
}
})
}
参数tagsToFilter
将是用户选择的所有标签(多选)。LogTag
对象是一个枚举,声明方式如下:
public enum LogTag: String, Codable, CaseIterable, Hashable, Identifiable
因为查询不允许我直接检查枚举,否则会崩溃,所以我用 rawValue “加倍”了信息。所以我创建了这样的 LogListView:。LogListView(tagsToFilter: [.case1, .case2])
我希望列表显示每个 LogInfo 对象,这些对象在此示例中具有标签的原始值“case1”或“case2”。
当我有一个空列表或我完全删除查询时,查询会起作用。但谓词不会过滤任何内容。我尝试了一个更简单的谓词,例如:
#Predicate<LogInfo> { logInfo in
tagsToFilter.contains(where: { tag in
tag.rawValue == logInfo.tagRawValue
}
}
但这会返回一个空列表。
是我理解错了,还是 SwiftData 的另一个限制?