Каждый раз, когда я запускаю предикат, я получаю ошибку
xCode версии 15.3
Назначение macOS Sonoma, 14.4
Свифт 5
@AppStorage(UserDefaults.Constants.selectedFilterName) static var selectedFilterName: String?
@Query(filter: #Predicate<Filter> {
$0.name == (selectedFilterName ?? "")
}) var selectedFilters: [Filter]
Модель:
@Model
class Filter: Hashable, Identifiable {
var id: String { name }
let name: String
}
Куча:
can't use NULL on left hand side
(
0 CoreFoundation 0x000000019c17eccc __exceptionPreprocess + 176
1 libobjc.A.dylib 0x000000019bc66788 objc_exception_throw + 60
2 CoreData 0x00000001a29cb744 -[NSSQLGenerator newSQLStatementForRequest:ignoreInheritance:countOnly:nestingLevel:nestIsWhereScoped:requestContext:] + 4040
3 CoreData 0x00000001a29ca62c -[NSSQLiteAdapter newSelectStatementWithFetchRequestContext:ignoreInheritance:] + 140
4 CoreData 0x00000001a29ca564 -[NSSQLFetchRequestContext _createStatement] + 52
5 CoreData 0x00000001a29ca34c -[NSSQLFetchRequestContext fetchStatement] + 172
6 CoreData 0x00000001a29ca22c -[NSSQLFetchRequestContext executeRequestCore:] + 28
7 CoreData 0x00000001a29c9e94 -[NSSQLStoreRequestContext executeRequestUsingConnection:] + 300
8 CoreData 0x00000001a29c9bbc __52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke + 60
нет, let name: String
когда ваш предикат зависит от значения свойства, обычно вам нужно создать ложный предикат, а затем установить реальный предикат, который использует значение вверху body. Так было и с @FetchRequest, хотя я не уверен, что с @Query.
FetchRequest использует NSPredicates, которые требуют, чтобы фильтр был унаследован от NSObject и являлся NSManagedObject. Я бы хотел избежать этого, так как не совсем понимаю, как это будет работать с @Model :[ Я все равно попробую установить реальный предикат в теле, но теперь без FetchRequest, если это возможно.
Вы неправильно поняли, что имел в виду Махал, он только сравнивал с FetchRequest, а не говорил, что вам следует его использовать. При использовании SwiftData вы не можете использовать ничего, связанное с Core Data. Я думаю, он имел в виду, что вам следует сделать что-то похожее на то, что я сделал в последней части этого ответа
я пробовал это, не помогает. Подожди минутку, я попробую твой ответ .onAppear { selectedFilter = (try? modelContext.fetch(FetchDescriptor<Filter>(predicate: #Predicate<Filter> { $0.name == (selectedFilterName ?? "") })) ?? [])?.first }
Спасибо вам всем! Это помогло, когда я попробовал ответить Йоакиму и раньше установил для selectedFilterName пустую строку!





@JoakimDanielson и @malhal — спасибо!
Ответ:
@Query(filter: Predicate<Filter>.false) var selectedFilters: [Filter]
init() {
selectedFilterName = ""
var fetchDescriptor = FetchDescriptor<Filter>(predicate: #Predicate { $0.name == (selectedFilterName ?? "") })
fetchDescriptor.fetchLimit = 1
_filters = Query(fetchDescriptor)
}
Является ли Filter.name необязательным?