我正在尝试使用
#Predicate
宏创建一个 Swift 谓词,如下所示:
final class Foo
{
var title: String = ""
var name: String = ""
}
let p = #Predicate<Foo> { $0.title == "test" }
这编译得很好,但在运行时会崩溃:
Foundation/KeyPath+Inspection.swift:65:致命错误:谓词不支持具有多个组件的键路径
根据 Xcode,宏扩展如下:
Foundation.Predicate<Foo>({
PredicateExpressions.build_Equal(
lhs: PredicateExpressions.build_KeyPath(
root: PredicateExpressions.build_Arg($0),
keyPath: \.title
),
rhs: PredicateExpressions.build_Arg("test")
)
})
为什么?我见过一些讨论线程,当 KeyPath 中涉及可选项时,会弹出此错误消息,但这里的情况并非如此。而且没有多个组件。
(我正在寻找解析谓词表达式以将它们转换为自定义数据库查询语句,但我什至无法获得一个简单的谓词来实际存在而不崩溃。)
在类声明之前删除
final
可以解决问题。
// Works:
class Foo {
var title: String = ""
}
// Crashes:
final class Foo {
var title: String = ""
}
那必须是一个错误。 Predicate 的文档中没有提及任何此类限制。如果这是某种预期的行为,那么无意义的“keyPath 中的多个组件”错误消息完全是误导性的。希望这可以节省其他人我在更多 Swift 疯狂上浪费的时间。