首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C NSPredicate链接

Objective-C NSPredicate链接
EN

Stack Overflow用户
提问于 2012-04-07 01:01:29
回答 2查看 356关注 0票数 3

全,

我尝试使用谓词返回搜索结果,优先考虑以搜索字符串VS开头的字符串。简单地包含在它里面。

例如,如果搜索字符串是"Objective-C",我想像这样得到过滤后的结果:

Objective-C a入门

Objective-C模式

Objective-C编程

所有关于Objective-C的东西

如何在Objective-C中编程

这是我尝试过的,但由于它是一个OR,它显然不会优先于第一个条件。有没有办法对谓词进行某种类型的“链接”?谢谢

代码语言:javascript
复制
  NSPredicate *filter = [NSPredicate predicateWithFormat:@"subject BEGINSWITH [cd] %@ OR subject CONTAINS [cd]", searchText,searchText];
  NSArray *filtered = [myArray filteredArrayUsingPredicate: filter];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-07 01:13:39

我不认为有一种方法可以单独使用NSPredicate。您所要求的似乎是经过排序的结果。通过在从谓词中获取结果之后对结果进行排序来实现这一点。在这种情况下,因为排序顺序不是简单的字母顺序,所以应该使用NSArray的-sortedArrayUsingComparator:方法。类似这样的东西(没有经过测试,只是在我脑海中打字)。

代码语言:javascript
复制
NSArray *sortedStrings = [filtered sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *string1 = (NSString *)obj1;
    NSString *string2 = (NSString *)obj2;
    NSUInteger searchStringLocation1 = [string1 rangeOfString:searchString].location;
    NSUInteger searchStringLocation2 = [string2 rangeOfString:searchString].location;
    if (searchStringLocation1 < searchStringLocation2) return NSOrderedDescending;
    if (searchStringLocation1 > searchStringLocation2) return NSOrderedAscending;
    return NSOrderedSame;
}];
票数 1
EN

Stack Overflow用户

发布于 2012-04-07 01:14:49

看起来您正在尝试使用谓词对数组进行排序,或者尝试仅使用谓词进行过滤和排序。谓词返回布尔值:字符串要么以搜索文本开头,要么包含搜索文本,或者不包含。谓词不会告诉你任何关于相对顺序的信息。筛选数组会删除您为其提供的谓词返回NO的那些对象,因此只有以搜索文本开头或包含搜索文本的对象才会出现在筛选出的数组中。实际上,由于任何以搜索文本开头的字符串也包含它,您可以将谓词简化为只包含“包含”部分。

如果要更改筛选结果的顺序,请使用适当的比较器对筛选数组进行排序。

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

https://stackoverflow.com/questions/10046643

复制
相关文章

相似问题

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