将NSString与一组不区分大小写的其他字符串进行比较的最佳方法是什么?如果它是其中一个字符串,则该方法应返回YES,否则返回NO。
答案 0 :(得分:10)
这是一个小帮手功能:
BOOL isContainedIn(NSArray* bunchOfStrings, NSString* stringToCheck)
{
for (NSString* string in bunchOfStrings) {
if ([string caseInsensitiveCompare:stringToCheck] == NSOrderedSame)
return YES;
}
return NO;
}
当然,这可以针对不同的用例进行大大优化。
例如,如果您针对常量bunchOfStrings进行了大量检查,则可以使用NSSet
来保存字符串的小写版本并使用containsObject:
:
BOOL isContainedIn(NSSet* bunchOfLowercaseStrings, NSString* stringToCheck)
{
return [bunchOfLowercaseStrings containsObject:[stringToCheck lowercaseString]];
}
答案 1 :(得分:2)
只需在Nikolai的回答中添加一些内容:
NSOrderedSame
定义为0
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
因此,如果您在caseInsensitiveCompare:
对象上致电nil
,您将获得nil
。然后你将nil
与NSOrderSame
(即0)进行比较,你会得到一个当然是错误的匹配。
此外,您还必须检查传递给caseInsensitiveCompare:
的参数是否必须为零。来自documentation:
此值不得为零。如果此值为nil,则行为为 未定义,可能会在OS X的未来版本中更改。