2012-11-13 25 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你不需要圍繞'%@'的單引號。 –