Сбой SwiftData Predicate: невозможно использовать NULL в левой части

Каждый раз, когда я запускаю предикат, я получаю ошибку
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

Является ли Filter.name необязательным?

Warren Burton 16.03.2024 14:21

нет, let name: String

murabye 16.03.2024 14:59

когда ваш предикат зависит от значения свойства, обычно вам нужно создать ложный предикат, а затем установить реальный предикат, который использует значение вверху body. Так было и с @FetchRequest, хотя я не уверен, что с @Query.

malhal 16.03.2024 15:03

FetchRequest использует NSPredicates, которые требуют, чтобы фильтр был унаследован от NSObject и являлся NSManagedObject. Я бы хотел избежать этого, так как не совсем понимаю, как это будет работать с @Model :[ Я все равно попробую установить реальный предикат в теле, но теперь без FetchRequest, если это возможно.

murabye 16.03.2024 15:13

Вы неправильно поняли, что имел в виду Махал, он только сравнивал с FetchRequest, а не говорил, что вам следует его использовать. При использовании SwiftData вы не можете использовать ничего, связанное с Core Data. Я думаю, он имел в виду, что вам следует сделать что-то похожее на то, что я сделал в последней части этого ответа

Joakim Danielson 16.03.2024 15:20

я пробовал это, не помогает. Подожди минутку, я попробую твой ответ .onAppear { selectedFilter = (try? modelContext.fetch(FetchDescriptor<Filter>(predicate: #Predicate<Filter> { $0.name == (selectedFilterName ?? "") })) ?? [])?.first }

murabye 16.03.2024 15:21

Спасибо вам всем! Это помогло, когда я попробовал ответить Йоакиму и раньше установил для selectedFilterName пустую строку!

murabye 16.03.2024 15:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@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)
}

Другие вопросы по теме