【发布时间】:2010-04-06 02:20:25
【问题描述】:
任何人都可以向我指出有关 Objective C 中不区分大小写比较的任何资源吗?它似乎没有与str1.equalsIgnoreCase(str2)等效的方法
【问题讨论】:
标签: ios objective-c cocoa-touch nsstring
任何人都可以向我指出有关 Objective C 中不区分大小写比较的任何资源吗?它似乎没有与str1.equalsIgnoreCase(str2)等效的方法
【问题讨论】:
标签: ios objective-c cocoa-touch nsstring
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
【讨论】:
@"Some String",恰好是nil,您的if 将把true 作为发送caseInsensitiveCompare 给@987654328 @ 是有效的,并导致另一个 nil,在我们的例子中,与 NSOrderedSame 相比,将返回 true(NSOrderedSame 定义为 0)。这可能是非常具有破坏性的错误的来源,就像我的情况一样。干杯!
NSString 上的一个类别内的一个方法,该方法返回一个布尔值。那么如果接收字符串为nil,则方法整体返回NO。
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
注意: stringA && 是必需的,因为当stringA 是nil 时:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
所以NSOrderedSame 也被定义为0。
下面的例子是一个典型的陷阱:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
【讨论】:
如果您想要更多控制而不仅仅是不区分大小写,另一种方法是:
[someString compare:otherString options:NSCaseInsensitiveSearch];
数字搜索和变音不敏感是两个方便的选项。
【讨论】:
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null]) 之类的东西来弥补误报吗?
在比较之前,您始终可以确保它们处于相同的情况:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
主要好处是您避免了 matm 描述的关于比较 nil 字符串的潜在问题。您可以在执行 compare:options: 方法之一之前检查字符串是否为 nil,或者您可以懒惰(像我一样)并忽略为每次比较创建新字符串的额外成本(如果您是只做一两次比较)。
【讨论】:
caseInsensitiveCompare)时,请始终使用它。
一种新的方式来做到这一点。 iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
【讨论】:
true,这绝对是 NOT 正确答案。
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
【讨论】:
试试这个方法
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
【讨论】:
将 Jason Coco 的答案转换为 Swift,供极度懒惰的人使用:)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
【讨论】:
在 iPhone ContactApp 中检查前缀
([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
this 博客对我很有用
【讨论】:
swift 的替代解决方案:
将两者都设为大写:
例如:
if ("ABcd".uppercased() == "abcD".uppercased()){
}
或将两者都设为小写:
例如:
if ("ABcd".lowercased() == "abcD".lowercased()){
}
【讨论】:
在 macOS 上,您可以简单地使用 -[NSString isCaseInsensitiveLike:],它返回 BOOL,就像 -isEqual: 一样。
if ([@"Test" isCaseInsensitiveLike: @"test"])
// Success
【讨论】:
NSMutableArray *arrSearchData;
NSArray *data=[arrNearByData objectAtIndex:i];
NSString *strValue=[NSString stringWithFormat:@"%@", [data valueForKey:@"restName"]];
NSRange r = [strValue rangeOfString:key options:NSCaseInsensitiveSearch];
if(r.location != NSNotFound)
{
[arrSearchData addObject:data];
}
【讨论】: