2012-11-13 89 views
0

考虑:NSPredicate predicateWithFormat:变量替换

MyObject *object1 = [MyObject createWithName:@"name1"]; 
MyObject *object2 = [MyObject createWithName:@"name2"]; 
MyObject *object3 = [MyObject createWithName:@"name3"]; 

NSArray *myArray = @[object1, object2, object3]; 
NSString *name = @"name1"; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == '%@'", name]; 
NSArray *filtered = [myArray filteredArrayUsingPredicate:predicate]; 

令我

filtered.count == 0 

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
           [NSString stringWithFormat:"name == '%@'",name]]; 
NSArray *filtered = [myArray filteredArrayUsingPredicate:predicate]; 

让我有

[filtered objectAtIndex:0] == object1 

为什么?这似乎是predicateWithFormat的一个奇怪行为。 NSPredicate的格式定义是否与NSLog/NSString不同? the docs我找不到任何明显的东西。

在此先感谢!

+1

我不知道你的问题的答案,但在第一个谓词中,你不应该在@周围有单引号。这使它成为一个文字,所以你在过滤“@”而不是名字。 – rdelmar

+0

你知道这个问题的答案! – Bryan

回答

2

我不知道为什么第二个版本可以工作,但是您的第一个版本不起作用的原因是@中的单引号。这使得@成为一个文字,所以你实际上过滤了name == @,这不是你想要的。只要删除单引号,它会起作用。

+0

+1你不需要围绕'%@'的单引号。 –