如何使用NSPredicate检索NSArray的索引?

我会知道如何使用NSPredicate检索NSArrayNSPredicate

 NSArray *array = [NSArray arrayWithObjects: @"New-York City", @"Washington DC", @"Los Angeles", @"Detroit", nil]; 

我应该使用这种方法来获得“Los Angles”的索引,只给出一个NSString
注意: @"Los An"@"geles"应该返回相同的索引..

使用NSPredicate,你可以得到包含你的searchstring的string数组(似乎没有内置的方法来获取元素索引):

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchString]; NSArray *filteredArray = [array filteredArrayUsingPredicate: predicate]; 

你可以只使用indexesOfObjectsPassingTest:获得索引indexesOfObjectsPassingTest: method:

 NSIndexSet *indexes = [array indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){ NSString *s = (NSString*)obj; NSRange range = [s rangeOfString: searchString]; return range.location != NSNotFound; }]; 

如果你只想得到一个包含你的string的元素,你可以使用类似的indexOfObjectPassingTest:方法。

你应该可以用块来做到这一点。 下面是一个片段(我没有编译器方便,所以请原谅任何错别字):

 NSArray *array = [NSArray arrayWithObjects: @"New-York City", @"Washington DC", @"Los Angeles", @"Detroit", nil]; NSString *matchCity = @"Los"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", matchCity]; NSUInteger index = [self.array indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { return [predicate evaluateWithObject:obj]; }]; 

基本上你可以使用indexOfObjectPassingTest:方法。 这需要一个块(在“^”之后的代码)并且返回匹配谓词的第一个对象的索引(如果不存在匹配则返回NSNotFound)。 该块迭代通过数组中的每个对象,直到find匹配(此时它返回索引)或找不到匹配(此时它返回NSNotFound)。 这是一个阻止编程的链接,可以帮助你理解块内的逻辑:

https://developer.apple.com/library/ios/featuredarticles/Short_Practical_Guide_Blocks/

在search更复杂的地方find了另一种方法,因为它允许谓词被用来查找对象,然后查找索引对象:

 -(NSIndexPath*) indexPathForSelectedCountry{ NSUInteger indexToCountry = 0; NSPredicate * predicate = [NSPredicate predicateWithFormat:@"isoCode = %@",self.selectedCountry.isoCode]; NSArray * selectedObject = [self.countryList filteredArrayUsingPredicate:predicate]; if (selectedObject){ if (self.searchDisplayController.isActive){ indexToCountry = [self.searchResults indexOfObject:selectedObject[0]]; }else{ indexToCountry = [self.countryList indexOfObject:selectedObject[0]]; } } return [NSIndexPath indexPathForRow:indexToCountry inSection:0]; } 

我会做这个..

 NSString * stringToCompare = @"geles"; int foundInIndex; for ( int i=0; i<[array count]; i++ ){ NSString * tryString = [[array objectAtIndex:i] description]; if ([tryString rangeOfString:stringToCompare].location == NSNotFound) { // no match } else { //match found foundInIndex = i; } }// end for loop 

基于@Louie的答案,而不是使用for循环我已经使用了枚举块为我工作。

我做到了这一点:

 NSString *stringToCompare = @"xyz"; [myArray enumerateObjectsUsingBlock:^(id *Obj, NSUInteger idx, BOOL * _Nonnull stop) { NSString * tryString = [[myArray objectAtIndex:idx] description]; if ([tryString rangeOfString:stringToCompare].location == NSNotFound) { // no match found } else { //match found and perform your operation. In my case i had removed array object at idx } }];