4

使用 predicateWithFormat,%@ 被 "" 包围。我们需要使用 %K 作为键。

例如[NSPredicate predicateWithFormat @"%@ == %@" ,@"someKey",@"someValue"]变成

"someKey" == "someValue"

在 stringWithFormat 时,%@ 没有被 "" 包围

[NSString stringWithFormat @"%@ == %@" ,@"someKey",@"someValue"] 

变成someKey == someValue

为什么有区别?

我错过了什么吗?

为什么在 predicateWithFormat 中使用 %@ 表示“Value”,因为这不是 %@ 在 stringWithFormat 中的意思。为什么不创建一个新的表示法,比如 %V 来获取“Value”,而 %@ 保持 Value 就像在 stringWithFormat 对应项中一样。

为什么 Apple 决定相同的符号,即 %@ 应该具有不同的含义。

他们真的不一样吗?我错过了什么吗?

4

2 回答 2

11

字符串变量在谓词中用引号括起来,而动态属性(以及因此的键路径)不被引用。考虑这个例子:

假设我们有一群人:

NSArray *people = @[
    @{ @"name": @"George", @"age": @10 }, 
    @{ @"name": @"Tom", @"age": @15 }
    ];

现在,如果我们想过滤我们的数组以便按姓名查找所有人,我们会期望一个谓词可以扩展为如下内容:

name like[c] "George"

这样我们就说它name是一个动态键并且George是一个常量字符串。@"%@ like[c] %@"因此,如果我们使用扩展谓词之类的格式,则为:

"name" like[c] "George"

这显然不是我们想要的(这里nameGeorge都是常量字符串)

所以建立我们的谓词的正确方法是:

NSPredicate *p = [NSPredicate predicateWithFormat:@"%K like[c] %@", @"name", @"George"];

我希望这是有道理的。您可以在此处的 Apple 文档中找到有关谓词的更多信息

于 2013-01-07T09:02:54.773 回答
1

嗯,NSPredicate 是一个评估某个字符串的函数,看这个例子 ,NSString stringWithFormat 只复制给相应位置的值——%@。用法完全不同,你可以用 NSPredicate 做很多复杂的操作。

于 2013-01-07T08:47:44.683 回答