SwiftData可选关系场景下如何正确编写Predicate查询谓词?
解决SwiftData中Predicate查询可选关联模型的错误
错误原因
你的代码中Question的category是可选类型(Category?),直接写$0.category.id时,编译器无法正确识别你要访问的是Category的id属性,反而将id误判为SwiftUI中View协议的id(_:)方法,从而引发类型不匹配的错误。
正确的Predicate写法
有三种可行的写法,可根据需求选择:
方法1:使用可选链(推荐)
通过?.安全访问可选类型的属性,当category为nil时,表达式结果为nil,与catId比较会返回false,自动过滤掉无分类的问题:
let questionPredicate = #Predicate<Question> { $0.category?.id == catId }
方法2:先判断非nil再解包
先明确排除category为nil的情况,再强制解包访问id(因为已经做了非nil判断,所以是安全的):
let questionPredicate = #Predicate<Question> { $0.category != nil && $0.category!.id == catId }
方法3:直接匹配Category实例(更可靠)
如果你已经获取到了目标Category实例cat,可以直接用实例匹配,避免依赖id的判断,同时结果更准确(防止id重复的极端情况):
if let cat = categories.first { cat.questions = parsedQuestions // 用cat实例构建Predicate let questionPredicate = #Predicate<Question> { $0.category == cat } let questionDescriptor = FetchDescriptor(predicate: questionPredicate) do { questions = try modelContext.fetch(questionDescriptor) } catch { fatalError("unable to find any questions for \(cat.title)") } }
内容的提问来源于stack exchange,提问作者soleil
相关产品推荐
相关产品推荐

