首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSPredicate格式

NSPredicate格式
EN

Stack Overflow用户
提问于 2014-08-07 15:18:16
回答 2查看 1.1K关注 0票数 1

我想使用NSArray方法过滤NSPredicate predicateWithFormat:。我有一些变量,我想在这种格式中使用几次。我不想写好几遍。下面是一个示例:

代码语言:javascript
运行
复制
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:,以及如何修复它吗?

代码语言:javascript
运行
复制
[someArray filteredArrayUsingPredicate:
     [NSPredicate predicateWithFormat:
         @"(field1 CONTAINS[cd] %1$@) OR (field2 CONTAINS[cd] %1$@)", 
     someText]];

我收到这一例外:

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

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-07 15:49:18

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

代码语言:javascript
运行
复制
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];

虽然它可能不会比重新键入变量名短得多.

票数 2
EN

Stack Overflow用户

发布于 2014-08-07 15:31:09

更新

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

代码语言:javascript
运行
复制
[NSString stringWithFormat:@"(field1 CONTAINS[cd] %1$@) OR (field2 CONTAINS[cd] %1$@)", someText];

原创

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25186200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档