2012-04-06 14 views
3

所有,Objective-C的NSPredicate链接

我想用谓词带回搜索回报,优先权给予与所搜索的字符串VS.开头的字符串简单包含在其中。

例如,如果搜索字符串是 “Objective-C的”,我想过滤的结果反馈如下:

Objective-C的一个入门
Objective-C的模式
Objective-C编程
所有关于Objective-C的
如何在Objective-C

这里计划是什么,我试过,但因为它是一个OR,这显然不向第一条件给予优先。有没有办法用谓词做一种“链接”?谢谢

NSPredicate *filter = [NSPredicate predicateWithFormat:@"subject BEGINSWITH [cd] %@ OR subject CONTAINS [cd]", searchText,searchText]; 
    NSArray *filtered = [myArray filteredArrayUsingPredicate: filter]; 

回答

1

我不认为有自己的方式来处理NSPredicate。你似乎要求的是排序结果。您可以通过在从谓词中获得结果后对结果进行排序来完成此操作。在这种情况下,由于排序顺序不是简单的字母顺序,因此您应该使用NSArray的-sortedArrayUsingComparator:方法。像这样的东西(没有测试过,从我头顶打出)。

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; 
}]; 
+0

现在更有意义了。感谢您澄清 – Slinky 2012-04-06 17:38:16

1

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

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

+0

明白了。感谢您的解释 – Slinky 2012-04-06 17:38:51