不区分大小写的比较NSString

Tej*_*udi 237 cocoa-touch objective-c nsstring ios

任何人都可以向我指出有关Objective C中不区分大小写的比较的任何资源吗?它似乎没有一个等效的方法str1.equalsIgnoreCase(str2)

Jas*_*oco 558

if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
  // strings are equal except for possibly case
}
Run Code Online (Sandbox Code Playgroud)

该文档位于搜索和比较方法中

  • 值得一提的是,如果从任何其他调用收到`@"Some String"`并且恰好是`nil`,则`if`将给出`true`,因为将`caseInsensitiveCompare`发送到`nil`是有效的,导致另一个`nil`,在我们的例子中,与`NSOrderedSame`相比将返回`true`(`NSOrderedSame`定义为0).这可能是一个非常具有破坏性的错误的来源,就像我的情况一样.干杯! (151认同)
  • 我的解决方法是将该比较实现为`NSString`上返回布尔值的类别中的方法.然后,如果接收字符串是"nil",则整个方法返回"NO". (10认同)
  • [这是一个例子](https://gist.github.com/defragged/cd1649edbf7934a37e17) (4认同)

ohh*_*hho 49

 NSString *stringA;
 NSString *stringB;

 if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
     // match
 }
Run Code Online (Sandbox Code Playgroud)

注意: stringA &&是必需的,因为时间stringAnil:

 stringA = nil;
 [stringA caseInsensitiveCompare:stringB] // return 0
Run Code Online (Sandbox Code Playgroud)

所以发生的事情NSOrderedSame也被定义为0.

以下示例是一个典型的陷阱:

 NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
 if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
     // what happens if "Rank" is not found in standardUserDefaults
 }
Run Code Online (Sandbox Code Playgroud)


dra*_*ard 46

如果您想要更多控制而不仅仅是不区分大小写,那么另一种选择是:

[someString compare:otherString options:NSCaseInsensitiveSearch];
Run Code Online (Sandbox Code Playgroud)

数字搜索和变音不敏感是两个方便的选择.

  • 如上面matm所述,如果someString为nil,则返回true. (4认同)

chr*_*ood 23

在比较之前,您可以始终确保它们处于相同的情况:

if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
    // They're equal
}
Run Code Online (Sandbox Code Playgroud)

主要好处是您可以避免matm描述的有关比较零字符串的潜在问题.您可以在执行其中一个compare:options:方法之前检查字符串是否为nil ,或者您可能是懒惰的(像我一样)并忽略为每个比较创建新字符串的额外成本(如果您只执行一个或两个比较).

  • 操作外壳进行比较通常不是明智之举(例如,火鸡测试:http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html).当你有语言支持的案例比较(例如`caseInsensitiveCompare`)时,总是使用它. (3认同)

Whi*_*ind 7

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Run Code Online (Sandbox Code Playgroud)

  • 如果答案有一些背景和描述,它对人们更有用. (12认同)

iGo*_*iGo 7

一种新的方法.iOS 8

let string: NSString = "Café"
let substring: NSString = "É"

string.localizedCaseInsensitiveContainsString(substring) // true
Run Code Online (Sandbox Code Playgroud)


小智 6

试试这个方法

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Run Code Online (Sandbox Code Playgroud)


Tas*_*sik 6

转换Jason Coco对Swift的回答是非常懒惰的:)

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}
Run Code Online (Sandbox Code Playgroud)


iMe*_*elf 5

检查iPhone ContactApp中的前缀

([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
Run Code Online (Sandbox Code Playgroud)

这个博客对我很有用