Shortcuts编辑器不识别布尔类型EntityQueryProperty的解决问询
解决AppIntents布尔属性查询的Shortcuts识别问题
问题场景
实现了遵循AppEntity、Identifiable协议的AlbumAppEntity,其中包含Bool类型的isHidden属性,希望通过EntityPropertyQuery对该属性进行查询。但配置后Shortcuts编辑器未将其识别为布尔参数,而是当作数字字段,运行时抛出AppIntents.EntityPropertyQueryError error 2错误,尝试多种NSPredicate写法均无法解决。
实体定义
struct AlbumAppEntity: AppEntity, Identifiable { @Property(title: "Hidden") var isHidden: Bool // 其他属性 }
原查询配置
static var properties = QueryProperties { Property(\AlbumAppEntity.$isHidden) { EqualToComparator { isHidden in if isHidden { return NSPredicate(format: "isHidden == YES") } else { return NSCompoundPredicate(type: .or, subpredicates: [NSPredicate(format: "isHidden = nil"), NSPredicate(format: "isHidden == NO")]) } } } }
解决方案
核心问题是未显式指定EqualToComparator的泛型类型,导致AppIntents无法正确推断参数为布尔类型,从而让Shortcuts编辑器错误识别为数字字段。只需在EqualToComparator后添加<Bool>泛型声明,同时确保NSPredicate写法正确即可。
修正后的查询配置
static var properties = QueryProperties { Property(\AlbumAppEntity.$isHidden) { // 显式指定泛型类型为Bool EqualToComparator<Bool> { targetIsHidden in if targetIsHidden { return NSPredicate(format: "isHidden == YES") } else { // 若业务场景中isHidden不可能为nil,可简化为NSPredicate(format: "isHidden == NO") return NSCompoundPredicate(orPredicateWithSubpredicates: [ NSPredicate(format: "isHidden == NO"), NSPredicate(format: "isHidden == nil") ]) } } } // 可选:给Shortcuts编辑器设置更友好的显示名称 .displayName("是否隐藏") }
关键说明
- 显式泛型声明:
EqualToComparator<Bool>明确告知AppIntents该查询参数的类型为布尔值,Shortcuts编辑器会自动渲染对应的布尔选择控件(开关/选项)。 - Predicate简化:如果你的数据模型中
isHidden不可能为nil,可以直接使用NSPredicate(format: "isHidden == %@", NSNumber(value: targetIsHidden))来简化逻辑,无需处理nil分支。 - 错误原因:原代码中未指定泛型类型,AppIntents默认按数字类型处理参数,导致运行时出现类型不匹配的
error 2,显式声明类型后即可解决该问题。
内容的提问来源于stack exchange,提问作者Marcos Tanaka
相关产品推荐
相关产品推荐

