代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

如何比较不区分大小写的NSRange?

  •  2
  • JohnBigs  · 技术社区  · 12 年前

    我写了一个方法来搜索通讯录中的人,我希望该方法能够找到“john bigs”,即使我调用该方法 [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;
    }
    

    请帮我把这件事做好。

    3 回复  |  直到 11 年前
        1
  •  4
  •   Nick Forge    12 年前

    您可以使用-[NStringrangeOfString:options:]以不区分大小写的方式进行搜索,因此只需一步即可完成:

    for (AddressCards *addressCard in book)
    {
        if ([addressCard.name rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
        {
            [results addObject:addressCard.name];
        }
    }
    
        2
  •  1
  •   J. Costa    12 年前

    您可以这样使用NSPredcate:

    -(NSMutableArray *) searchName:(NSString *) someName {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY addressCard.name CONTAINS[c] %@", someName];
        return [NSMutableArray arrayWithArray:[book filteredArrayUsingPredicate:predicate]];
    }
    

    这里的诀窍是 [c] 。这相当于不区分大小写。

    注意,我在假设 第个,共个 不可变数组 类型,如果是 NSMutableArray(NS可变阵列) ,使用谓词将过滤“原始”数组。

        3
  •  0
  •   vikingosegundo    12 年前

    你可以用这个

    BOOL containsName = [[addressCard.name lowercaseString] containsSubstring: [someName lowercaseString]];
    if(containsName)
        [results addObject:addressCard.name];