zoukankan      html  css  js  c++  java
  • 比较字符串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。
  • 相关阅读:
    EXCEL中用VLOOKUP功能,根据A列的值,把B列也填充上对应的值
    ReNamer批量重命名文件,如何给杂乱无章的文件名重新命名
    小米手机亲情守护(风筝守护)怎么解绑?
    PHP正则表达式遇到的一个utf8乱码坑
    筹米网你用过没?是套路还是真能帮你提前抢购域名?
    CSS选取第一个、最后一个、偶数、奇数、第n个标签元素
    winscp会话超时及尝试关闭优化连接缓冲大小
    Linux下压缩和解压
    一步一步学Linux下vi/vim的使用(案例比纯理论好学)
    Linux使用find命令,搜索文件名中带有通配符*,报错: paths must precede expression
  • 原文地址:https://www.cnblogs.com/zzh1236/p/2024611.html
Copyright © 2011-2022 走看看