2011-11-15 147 views
14

我正在研究检查数组以查看它是否包含某个字符串的应用程序。然而,它似乎并没有正确的工作,因为我认为它可能在查看字符串的情况。 在这段代码中,我将如何确保containsObject:不区分大小写?NSArray中的大小写不敏感containsObject:

if ([myArray containsObject:term]) {...} 

请问你是否需要说明,谢谢你的帮助。

(另外,我发现这样一个问题:Case insensitive comparison NSString我不知道这是我需要的,如果是,我将如何使用它。)

回答

6

NSArray是(目的地)不知道它拥有什么。因此,它不知道NSString,更不用说区分大小写。你将不得不遍历数组的项目并进行比较。您可以使用通过数组循环的许多不同的方法之一:

  • objectEnumerator
  • indexOfObjectPassingTest:它使用块来执行您的操作。
  • 为每个项目调用objectAtIndex:

我会建议前2个选项之一。

+0

我得看看这个,当我得到机会。谢谢! – thekmc

24
if ([myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
     return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame); 
    }] != NSNotFound) { 
    // there's at least one object that matches term case-insensitively 
} 
0
- (BOOL)containsObject:(id)anObject 

是,你可以不适用你的目的的便捷方法。这里是文档讨论:

该方法确定由 anObject是否存在于该阵列中的发送的isEqual:消息发送到每个阵列的对象(和 传递anObject作为参数给每个isEqual:方法消息)。

一般的NSObject方法isEqual:方法不能考虑字符串的情况。如果你可以使用块(iOS 4),最好的解决方案可能就是Kevin Ballard的主张。如果没有,那么你可能需要迭代字符串。

-1
if ([@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame) { 
    //... 
} 

这一个可能对你有用...所有最好的

14

下面是使用键 - 值编码的有效途径。

NSArray *strings; // array of strings 
if ([[strings valueForKey:@"lowercaseString"] containsObject:[searchString lowercaseString]]) { 
    NSLog(@"searchString found"); 
} else { 
    NSLog(@"searchString NOT found"); 
} 

斯威夫特3选项:

let things = ["foo", "Bar"] 
let searchString = "FOO" 

if things.contains(where: { $0.lowercased() == searchString.lowercased() }) { 
    print("found searchString") 
} else { 
    print("searchString not found") 
}