⽐较字符串NSString
我想你很快就会在程序中需要⽐较两个字符串是否相等。在C中,你知道可以使⽤strcmp(string1,string2)函数:
char string1[] = "Yo";
char string2[] = "Yo";
if (strcmp(string1, string2) == 0) {
// do the following code
}
条件表达式的结果将会是真,从⽽执⾏if语句⼤括号中的代码。在Cocoa中,也是相类似的。记住,当我们声明⼀个字符串时:
NSString *aString;
变量
aString并不真正包含⼀个字符串对象—它是指向内存中字符串对象的指针。我们称呼这类变量的另⼀个名称是对象标识符,因为它是标识内存
中的⼀个对象⽽不是保存这个对象。这个技术细节有很重要的含义,指针是⼀个内存位置的地址。考虑下⾯我们通过“==”⽐较两个字符串对象的情
况:
NSString *string1 = @"A String";
NSString *string2 = @"A String";
这⾥,我们静态地创建了两个NSString对象,它们是两个不同的对象,但它们都包含相同的值。现在,如果我们使⽤
C的等号操作符,
BOOL result = string1 == string2;
等号表达式的值将为“不等”(Objective-C中是“false”)。对,是“不等”。我们看着是相等的,但是这⾏代码⽐较的不是字符串—它⽐较的是它们内
存地址的值。由于它们不是⼀个相同的对象,它们存在于各⾃的内存位置,因此string1的地址和string2的并不相同。这说明了表达式的值为什么为
假。
现在,如果我们象下⾯这么做:
NSString *string1 = @"A String.";
NSString *string2 = string1;
BOOL result = string1 == string2;
这次等号操作符将返回
“真”,因为string1和string2都指向相同的对象的内存位置—它们的地址相同。NSString *string2=string1;这⾏
字符串截取对象
把string1的地址存到了string2中。所以现在地址是相等了,就好象我们在等式中表现的⼀样。
现在让我们归纳⼀下,如果变量的数据类型是int,double,char或float,等号操作符会如我们想象那么
起作⽤,因为这些变量的数据类型不是指针,它们实际上包含了数据的值。只有对象变量(和所有的指针变量)会成为这⼀现象的牺牲品。
所以,我希望你习惯有些⽼⽅法在⾯向对象编程中不再适⽤。我现在将⽰范怎么进⾏⽐较和相等判断。
当你想判断两个对象是否相等时,你必须调⽤相应的类中的⽐较method。在NSString中,最直接的是- isEqualToString:这个method,它
的参数是⼀个NSString对象,返回值是⼀个布尔值表明接收者字符串是否与参数字符串相等。现在,我们可以试验⼀下:
NSString *string1 = @"A String.";
NSString *string2 = @"A String.";
BOOL result = [string1 isEqualToString: string2];
这个语句将返回
“真”,因为string1和string2指向的对象的值是相等的。⼀个更通⽤的method是- compare:,它可以⽐较字符串时候和接收者的
相等,或者这个字符串是在接收者之前还是之后(按照字典的顺序,也就是词汇顺序)。compare:的返回类型是⼀种称
为NSComparisonResult的
Cocoa数据类型,它有三个可能的值
:NSOrderedAscending,NSOrderedSame,NSOrderedDescending(它们只是在基础框架中定义的常数,分别等于整数-1,0,1)。
所以,我们可以按照下⾯的⽅法使⽤compare:
NSString *string1 = @"aardvark";
NSString *string2 = @"tarsier";
BOOL result = [string1 compare: string2] == NSOrderedAscending;
因为string2在string1的字母顺序之后,发给string1的消息将返回NSOrderedAscending,由于我们使⽤相等操作符来
与NSOrderedAscending进⾏判断,所以结果为“真”。这相当于说string2⼤于string1。
通过把NSOrderedAscending替换为NSOrderedSame或NSOrderedDescending,我们可以判断接收着(string1)是否与参数(string2)
相等,或者string2按字母顺序排在string1之前。
在这个系统中,⼤写字母⼩于⼩写字母。所以,下⾯的计算结果为“真”:
NSString *string1 = @"Aardvark";
NSString *string2 = @"aardvark";
BOOL result = [string1 compare: string2] == NSOrderedAscending;
这时因为在词汇顺序上
“Aardvark”在“aardvark”之前(想象⼀下字典中的单词排列顺序)。如果你想不考虑⼤⼩写地⽐较字符串,使
⽤-caseInsensitiveCompare:。这个method的使⽤⽅法为(使⽤与前⾯⼀个例⼦相同的字符串):
BOOL result = [string1 caseInsensitiveCompare: string2] == NSOrderedSame;
结果将为
“真”
这是你可以使⽤的⼀些基本的字符串⽐较
method。如果你需要⽐这⾥讲的更多的method,你可以仔细读⼀下类的⽂档,你可以到⼀些给你更⼤
灵活性和选择的字符串⽐较method。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。