使用Array.contains()构建#Predicate宏失败,如何筛选指定标签的文档?
解决#Predicate筛选包含指定标签文档的报错问题
问题重现
当试图通过#Predicate筛选包含指定TagModel的DocumentModel时,原代码报错无法转换为any StandardPredicateExpression:
let selectedTag = TagModel() #Predicate<DocumentModel> { document in document.tags.contains { $0.tagID == selectedTag.tagID } }
错误原因
#Predicate宏在解析外部变量时,直接引用selectedTag.tagID会被错误地解析为KeyPath表达式,而非常量值表达式,导致类型不匹配。
正确写法
有两种可行的修正方式:
方式1:提取目标tagID为常量
先将selectedTag的tagID提取为独立常量,再在Predicate闭包中使用:
let selectedTag = TagModel() let targetTagID = selectedTag.tagID let predicate = #Predicate<DocumentModel> { document in document.tags.contains { $0.tagID == targetTagID } }
方式2:使用@前缀引用外部变量
在#Predicate闭包中引用外部变量时,添加@前缀,让宏正确识别为外部值:
let selectedTag = TagModel() let predicate = #Predicate<DocumentModel> { document in document.tags.contains { $0.tagID == @selectedTag.tagID } }
验证逻辑
两种写法都会让宏生成正确的表达式:将document.tags的元素tagID与常量值(targetTagID或@selectedTag.tagID)做相等比较,最终返回包含匹配标签的文档。
内容的提问来源于stack exchange,提问作者Atsuo Sakakihara
相关产品推荐
相关产品推荐

