Swift 谓词:具有多个组件的致命错误键路径

问题描述 投票:0回答:1

背景

我正在尝试使用

#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 中涉及可选项时,会弹出此错误消息,但这里的情况并非如此。而且没有多个组件。

(我正在寻找解析谓词表达式以将它们转换为自定义数据库查询语句,但我什至无法获得一个简单的谓词来实际存在而不崩溃。)

详情

  • Swift 语言版本:6
  • Xcode 版本:16.2
  • 部署目标:macOS 15.2
swift predicate keypaths swift-keypath swift-macro
1个回答
0
投票

修复:

在类声明之前删除

final
可以解决问题。

// Works:
class Foo {
    var title: String = ""
}

// Crashes:
final class Foo {
    var title: String = ""
}

讨论:

必须是一个错误。 Predicate 的文档中没有提及任何此类限制。如果这是某种预期的行为,那么无意义的“keyPath 中的多个组件”错误消息完全是误导性的。希望这可以节省其他人我在更多 Swift 疯狂上浪费的时间。

© www.soinside.com 2019 - 2024. All rights reserved.