我想使用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$@)"'
提前致谢
答案 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个占位符,但您只提供一个值。