[英]How can I compare case insensitive NSRange ?
我写了一个方法来搜索通讯录中的人,并且我希望该方法即使我叫[someAdressBook searchName:@"joh"];
也能找到“ john [someAdressBook searchName:@"joh"];
。
我的方法适用于全名,但是我在部分名称中有问题,这是我的代码:
-(NSMutableArray *) searchName:(NSString *) someName{
NSRange range;
NSMutableArray *results = [[NSMutableArray alloc] init];
for (AddressCards *addressCard in book)
{
if (someName != nil && [someName caseInsensitiveCompare:addressCard.name] == NSOrderedSame)
[results addObject:addressCard.name];
else {
range = [addressCard.name rangeOfString:someName];
if (range.location != NSNotFound)
[results addObject:addressCard.name];
}
}
NSLog(@"%@", results);
return results;
}
请帮助我解决这个问题。
您可以使用-[NSString rangeOfString:options:]以不区分大小写的方式进行搜索,因此可以一步完成:
for (AddressCards *addressCard in book)
{
if ([addressCard.name rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
{
[results addObject:addressCard.name];
}
}
您可以这样使用NSPredicate:
-(NSMutableArray *) searchName:(NSString *) someName {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY addressCard.name CONTAINS[c] %@", someName];
return [NSMutableArray arrayWithArray:[book filteredArrayUsingPredicate:predicate]];
}
这里的诀窍是[c] 。 这等效于不区分大小写。
注意,我假设这本书是NSArray类型的,如果它是NSMutableArray ,则使用谓词将过滤“原始”数组。
你可以用这个
BOOL containsName = [[addressCard.name lowercaseString] containsSubstring: [someName lowercaseString]];
if(containsName)
[results addObject:addressCard.name];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.