Une solution possible consiste à utiliser une expression régulière pour cela. Nous avons juste besoin d'insérer .*
entre chaque lettre (et avant et après la chaîne) qui signifie "n'importe quel caractère (sauf pour les terminaisons de ligne)". Il semble que c'est ce qui est utilisé pour la recherche sur l'achèvement de XCode.
NSMutableArray *letters = [[NSMutableArray alloc] init];
[searchString enumerateSubstringsInRange:NSMakeRange(0, [searchString length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
[letters addObject:substring];
}];
NSMutableString *pattern = [[NSMutableString alloc] initWithString:@".*"];
[pattern appendString:[letters componentsJoinedByString:@".*"]];
[pattern appendString:@".*"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.%K MATCHES[C] %@", keyToFilter, pattern];
échantillon à jouer, insérer juste avant:
NSString *keyToFilter = @"attribute";
NSArray *array = @[@{keyToFilter:@"UITextField"}, @{keyToFilter:@"nsarray"}, @{keyToFilter:@"uitf"}];
NSString *searchString = @"uitf";
et juste après:
NSArray *filtered = [array filteredArrayUsingPredicate:predicate];
NSLog(@"SearchString: %@\nFiltered: %@", searchString, ([filtered count]?[filtered valueForKey:keyToFilter]:@"NO RESULT"));
sortie:
$>SearchString: uitf
Filtered: (
UITextField,
uitf
)
Le code pris pour la construction du réseau de Les lettres proviennent du here. Différentes solutions auraient pu être utilisées pour créer pattern
, ce n'est peut-être pas la meilleure, mais c'est une solution de travail.
Bonus:
Et pour le plaisir (j'étais intrigante sur la façon de le faire), d'une manière possible de colorer la liste (j'ai fait un tableau de NSAttributedString
) pour adapter (non vérifié ou erreurs gratuit) :
NSMutableArray *filteredColored = [[NSMutableArray alloc] init];
for (NSDictionary *aDict in filtered) //or for (MyObjectClass *myObject in filtered)
{
NSString *aFilteredValue = aDict[keyToFilter]; //or NSString *aFilteredValue = [myObject attribute]
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:aFilteredValue attributes:@{}];
NSInteger currentIndex = 0;
for (NSString *aLetter in letters)
{
NSRange rangeFound = [aFilteredValue rangeOfString:aLetter
options:NSCaseInsensitiveSearch
range:NSMakeRange(currentIndex, [aFilteredValue length]-currentIndex)];
if (rangeFound.location != NSNotFound)
{
currentIndex = rangeFound.location+rangeFound.length;
[attr addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:rangeFound];
}
}
[filteredColored addObject:attr];
}