【发布时间】:2023-03-28 22:18:01
【问题描述】:
我正在尝试组合 NSExpression + NSPredicate 来创建一个简单的功能,用户可以在其中输入类似 size + 1 > 3 的内容,然后它会评估表达式。
首先,为了确保我可以让 NSExpression 使用变量,我尝试了以下方法:
NSExpression(format: "2 + 1")
.expressionValue(with: nil, context: nil)
// == 3
NSExpression(format: "myInt + 1")
.expressionValue(with: ["myInt": 2], context: nil)
// == 3
接下来,为了确保我可以评估 NSPredicate,我尝试了以下方法:
NSPredicate(format: "2 + 1 == 3")
.evaluate(with: nil)
// == true
现在,当我尝试将两者结合时,我得到error: Execution was interrupted, reason: signal SIGABRT.,无论我尝试哪种组合:
NSPredicate(format: "size + 1 == 3")
.evaluate(with: ["size": 2])
// error: Execution was interrupted, reason: signal SIGABRT.
NSPredicate(format: "$size + 1 == 3")
.evaluate(with: ["size": 2])
// error: Execution was interrupted, reason: signal SIGABRT.
NSPredicate(format: "size + 1 == 3")
.withSubstitutionVariables(["size": 2])
.evaluate(with: nil)
// error: Execution was interrupted, reason: signal SIGABRT.
NSPredicate(format: "$size + 1 == 3")
.withSubstitutionVariables(["size": 2])
.evaluate(with: nil)
// error: Execution was interrupted, reason: signal SIGABRT.
我知道大多数 NSPredicate 用于过滤列表,这让我想知道像上面这样的用例是否可以工作。
是否可以在 NSPredicate 中使用一次性评估的变量?
【问题讨论】:
标签: swift nspredicate nsexpression