NSPredicate格式

时间:2014-08-07 15:18:17

标签: ios objective-c nsstring nspredicate

我想使用NSArray方法过滤NSPredicate predicateWithFormat:。我有一些变量,我希望以这种格式多次使用。我不想多次写它。这是一个例子:

NSString *someText = @"some text";
NSString *str = [NSString stringWithFormat:
          @"(field1 CONTAINS[cd] %1$@) OR (field2 CONTAINS[cd] %1$@)", someText];
NSLog(@"%@", str);
// prints : (field1 CONTAINS[cd] some text) OR (field2 CONTAINS[cd] some text)

所以它适用于NSString stringWithFormat:

有人能解释为什么它不能用NSPredicate predicateWithFormat:工作以及如何修复它?

[someArray filteredArrayUsingPredicate:
     [NSPredicate predicateWithFormat:
         @"(field1 CONTAINS[cd] %1$@) OR (field2 CONTAINS[cd] %1$@)", 
     someText]];

我收到此例外:

由于未捕获的异常终止应用' NSInvalidArgumentException',原因:'无法解析格式字符串"(field1 CONTAINS[cd] %1$@) OR (field2 CONTAINS[cd] %1$@)"'

提前致谢

2 个答案:

答案 0 :(得分:2)

由于用于声明变量的NSPredicate符号,$解析器可能不接受位置说明符。顺便说一下,使用变量可以解决你的问题。

NSString *someText = @"some text";
NSPredicate *predicate = [NSPredicate predicateWithFormat:
         @"(field1 CONTAINS[cd] $someText) OR (field2 CONTAINS[cd] $someText)"]];
NSDictionary *varSub = [NSDictionary dictionaryWithObject:someText forKey:@"someText"];
NSPredicate *filterPredicate = [predicate predicateWithSubstitutionVariables:varSub];

虽然它可能不比重新输入变量名称短......

答案 1 :(得分:0)

更新

您将文字字符串作为参数传递给-predicateWithFormat:而不是

的结果
[NSString stringWithFormat:@"(field1 CONTAINS[cd] %1$@) OR (field2 CONTAINS[cd] %1$@)", someText];

ORIGINAL

您的-stringWithFormat:调用提供的格式字符串包含2个占位符,但您只提供一个值。