我正在尝试学习如何使用谓词,因此我尝试使用filteredArrayUsingPredicate替换以下工作代码......
[filteredLocations removeAllObjects];
for (NSString *location in locations) {
NSRange range = [location rangeOfString:query options:NSCaseInsensitiveSearch];
if (range.length > 0) {
[filteredLocations addObject:location];
}
}
相反,我正在尝试......
[filteredLocations removeAllObjects];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", searchText];
[filteredLocations addObjectsFromArray: [locations filteredArrayUsingPredicate:predicate]];
对于loop rangeOfString,我没有得到与谓词相同的结果。使用string的范围,例如searchText返回一个8项数组,而具有相同值的返回只有2与谓词。另一个例子,hono将在locations数组中找到honolulu,而使用谓词则找不到任何内容。
据我了解,SELF代表被评估的对象,即。位置数组,所以我认为这是正确的语法。
任何帮助将不胜感激
谢谢,约翰
答案 0 :(得分:3)
我认为在你的for循环中,你指定了一个选项NSCaseInsensitiveSearch,但在谓词中你没有。
你可以试试这个
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF contains[cd] %@)", searchText];
可以在此处查看更多详细信息 NSPredicate Tutorial