gpt4 book ai didi

cocoa - NSPredicate 和数组

转载 作者:行者123 更新时间:2023-12-03 16:24:08 25 4
gpt4 key购买 nike

我有一个简短的问题。我有一个充满 Cars (继承自 NSObject)的 NSArrayCar 具有 @property NSString *engine(也被视为 @synthesize)

现在我想使用 NSPredicate 过滤数组:

predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(engine like %@)", searchText]];
newArray = [ArrayWithCars filteredArrayUsingPredicate:predicate];

这会引发 valueForUndefinedKey 错误。 predicateWithFormat 正确吗?

感谢您的回复。

最佳答案

这是它不起作用的真正原因:

当您使用stringWithFormat:构建字符串时,它看起来像这样:

@"engine like searchText"

然后将其传递给 predicateWithFormat:,这将看到比较的左侧和右侧都是不带引号的字符串,这意味着它会将它们解释为键路径

当这段代码运行时,它将执行以下操作:

id leftValue = [object valueForKey:@"engine"];
id rightValue = [object valueForKey:@"searchText"];
return (leftValue is like rightValue);

抛出的异常是您的对象提示它没有名为“searchText”的方法,这是正确的。

与此对比,如果您取出 stringWithFormat: 调用并将所有内容直接放入 predicateWithFormat::

NSPredicate *p = [NSPredicate predicateWithFormat:@"engine like %@", searchText];

predicateWithFormat: 很聪明。它看到“啊哈,一个 %@ 替换模式!这意味着我可以从参数列表中弹出一个参数,然后将其装箱并按原样使用”。这正是它要做的。它将从参数列表中弹出 searchText 的值,将其放入 NSExpression 中,然后将其直接插入到已解析的表达式树中。

这里最有趣的是它创建的表达式将是一个常量表达式。这意味着它是一个字面值;不是关键路径,不是集合等。它将是文字字符串。然后当你的谓词运行时,它将执行以下操作:

id leftValue = [object valueForKey:@"engine"];
id rightValue = [rightExpression constantValue];
return (leftValue is like rightValue);

这是正确的,这也是为什么在将内容传递给 predicateWithFormat: 之前不应通过 stringWithFormat: 传递内容。

关于cocoa - NSPredicate 和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2506836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com