所有
我正在尝试使用谓词来恢复搜索返回,优先使用以搜索字符串VS开头的字符串。只是包含在其中。
例如,如果搜索字符串是“Objective-C”,我想像这样得到过滤后的结果:
Objective-C a Primer
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];
答案 0 :(得分: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;
}];
答案 1 :(得分:1)
看起来您正在尝试使用谓词对数组进行排序,或者尝试仅使用谓词过滤AND排序。谓词返回布尔值:字符串以搜索文本开头或包含搜索文本,或者不包含搜索文本。谓词不会告诉您有关相对顺序的任何信息。过滤数组会删除您提供的谓词返回NO的对象,因此只有以搜索文本开头或包含搜索文本的对象才会出现在已过滤的数组中。实际上,由于任何以搜索文本开头的字符串也包含它,因此您可以将谓词简化为“包含”部分。
如果要更改过滤结果的顺序,请使用适当的比较器对过滤后的数组进行排序。