Objective-C学习--字符串

摘要:
C语言将字符串视为一个简单的字符数组,并在数组末尾添加尾随的零字符作为结束符号。

C语言将字符串作为简单地字符数组处理,并且在数组最后添加尾部零字符作为结束标志。而Cocoa中的NSString则有很多内置方法,他们让字符串的处理变得简单很多

1. 创建字符串

   NSString的stringWithFormat:方法

+(id) stringWithFormat:(NSString *) format, ...;//省略号表示这个方法可以接收多个以逗号隔开的其他参数,就像printf()和NSLog()一样

  可以用如下方式创建一个新的字符串

NSString *height;

  height=[NSString stringWithFormat: @"Your height is %d feet,%d inches",5,11];

2. 关于大小

  NSString中另一个方便的方法是length,它返回的是字符串中的字符个数

-(unsigned int) length;

 可以这样使用它:

unsigned int length=[height length];

也可以在表达式中使用它

if([height length]>30){

    NSLog(@"wow, you are really tall!");

}

说明:NSString的length方法能够准确无误地处理国际字符串,如含有俄文、中文或者日文字符的字符串,以及使用Unicode国际字符标准的字符串。在C语言中处理这些国际字符串是件令人非常头疼的事情,因为一个字符占用的空间可能多于1个字节,这就意味着如strlen()之类只计算字节数的函数会返回错误的数值。

3. 字符串比较

isEqualToString:可以用来比较接收方和当做参数传递来的字符串

isEqualToString:返回一个BOOL型数据来表示两个字符串的内容是否相同

-(BOOL) isEqualToString: (NSString *) aString;

使用方法

NSString *thing1=@"hello 5";

NSString *thing2;

thing2=[NSString stringWithFormat: @"hello %d",5];

if([thing1 isEqualToString: thing2]){

    NSLog(@"They are the same!");

}

要比较两个字符串,可以使用compare:方法

-(NSComparisonResult) compare: (NSString *) string;

compare:将接受对象和传递来的字符串逐个字符地进行比较,它返回一个NSComparisonResult(就是一个enum型数据)来显示比较结果

typedef enum _NSComparisonResult{

    NSOrderedAscending=-1;

    NSOrderedSame;

    NSOrderedDescending

}NSComparisonResult;

注意:

如果检查两个对象是否是同一个对象,应该用==

如果查看等价性(即这两个字符串是否代表同一个事物),应该用isEqualToString

如果你曾经用过C语言中的函数qsort()或bsearch(),那么这看起来也许会比较熟悉,ruguocompare:返回的结果是NSOrderedAscending,那么左侧的数值就小于右侧的数值,即compare的目标在字母表中的排序位置比传递进来的字符串更靠前

例如

[@"aardvark" compare: @"zygote"]将会返回NSOrderedAscending:

[@"zoinks" compare: @"jinkies"]将会返回NSOrderedDescending

[@"fnord" compare: @"fnord"]返回的是NSOrderedSame.

 4. 不区分大小写的比较

compare:进行的是区分大小写的比较。换句话说,@“Bork”和@“bork”的比较是不会返回NSOrderedSame的,我们还有一个方法compare:options:,它能给我们更多的控制权

-(NSComparisonResult) compare: (NSString *) string

                                  options: (unsigned) mask;

options参数是一个位掩码,你可以使用位或运算符(|)来添加选项标记。一些常用的选项如下。

NSCaseInsensitiveSearch:不区分大小写字符

NSLiteralSearch:进行完全比较,区分大小写

NSNumericSearch:比较字符串的字符个数,而不是字符值。如果没有这个选项,“100”会排在“99”的前面,这会让人觉得奇怪,甚至也可能是错误的排序。

例如,如果你想进行字符串的比较,要忽略大小写但按字符个数的多少正常排序,那么应该这么做:

if([thing1 compare: thing2 option:NSCaseInsensitiveSearch | NSNumbericSearch]==NSOrderedSame){

    NSLog(@"They match!");

}

5. 字符串内是否还包含别的字符串

检查字符串是否以另一个字符串开头:-(BOOL) hasPrefix: (NSString *) aString;

判断字符串是否以另一个字符串结尾: -(BOOL) hasSuffix:(NSString *) aString;

例如:

NSString * filename=@"draft-chapter.pages";

if([filename hasPrefix: @“draft”]){

}

if(filename hasSuffix: @".mov"){

}

如果你想知道字符串内的某处是否包含其他字符串,请使用rangeOfString:

-(NSRange) rangeOfString: (NSString *) aString;

将rangeOfString:发送给一个NSString对象时,传递的参数是要查找的字符串,它会返回一个NSRange struct来告诉你与这个字符串相匹配的部分在哪里以及能够匹配上的字符个数。

例如

NSRange range;

range=[filename rangeOfString: @"chapter"];

返回的range.start为6,range.length为7,如果传递的参数在接收字符串中没有找到,那么range.start 则等于NSNotFound

 6. 可变性

NSString是不可变的,这并不意味着你不能操作它们,不可变的意思是一旦NSString被插u那个键,我们就不能改变它,你可以对它执行各种各样的操作。例如用它生成新的字符串,查找字符串**将它与其他字符串比较,但是你不能删除字符或者添加字符的方式来改变它。

Cocoa提供了一个NSString的子类,叫做NSMutableString,如果你想改变字符串,请使用**子类

说明: java程序员应该很熟悉这种区别,NSString就像java中的String类一样,而NSMutableString则与java中的StringBuffer类很相似

可以使用类方法stringWithCapacity:来创建一个新的NSMutableString,声明如下

-(id) stirngWithCapacity: (unsigned) capacity;

这个容量只是给NSMutableString的一个建议,字符串***并不仅限于所提供的容量,这个容量仅是个最优值。例如,如果你知道你要创建一个大小**的字符串,那么NSMutableString可以预分配一块内存来存储它,这样后续操纵的速度***很多,可按如下方式插u功能键一个新的可变字符串

NSMutableString * string;

string=[NSMutableString stringWithCapacity: 42];

一旦有了一个可变字符串,就可以对它执行各种操作了,一种常见的操作时通过appendString: 或appendFormat:来附加新字符串

例如

-(void) appendString:(NSStrng *) aString;

-(void) appendFormat:(NSString *) format,...;

appendString 接收参数aString,然后将其复制到接收对象的末尾

appendFormat的工作方式与stringWithFormat:类似,但它讲格式化的字符型附加在接受字符串的末尾,而不是创建新的字符串对象

例如

NSMutableString *string;

string =[NSMutableString stringWithCapacity: 50];

[string appendString: @"hello there"];

[string appendFormat:@"human %d",39];

这段代码的结果是string被赋值为“hello there human 39”

你可以用deleteCharacterInRange:方法删除字符串中的字符

-(void) deleteCharacterInRange: (NSRange) range;

你会经常将deleteCharactersInRange:和rangeOfString:连载一起使用。记住,NSMutableString是NSString的子类,通过神奇的OOP方法,你也可以在NSMutableString中使用NSString的所有功能,包括rangeOfString:字符串比较方法和其他任何功能

例如

创建朋友列表:

NSMutableString *friend;

friends=[NSMutableString stringWithCapacity: 50];

[friend appendString: @"Jamas bethLynn Jack Evan"];

接下来找到Jack的字符范围:

NSRange JackRange;

JackRange=[friends rangeOfString: @"Jack"];

JackRange.length++;

这个例子中,字符范围开始于15,长度为5,现在我们就可以把Jack将从圣诞卡列表中删除了

[friends deleteCharactersInRange: JackRange];

在实现描述方法时,使用可变字符串是非常方便的,你可以通过appendString和appendFormat为对象创建一个详尽的描述

由于NSMutableString是NSString的子类,所以我们“免费”获得了两个特性。第一个就是任何使用NSString的地方,都可以用NSMutableString来替代,任何接收NSString的方法也都会接收NSMutableString,字符串的使用者其实不关心它是否可变

另一个热性源于继承,与实例方法一样,继承对类方法也同样适用,所以NSString中非常方便的类方法stringWithFormat:也可以用来创建新的NSMutableString,你可以简单地以某种格式来创建一个可变字符串:

NSMutableString *string;

string=[NSMutableString stringWithFormat: @"jo%ddy",2];

免责声明:文章转载自《Objective-C学习--字符串》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php 命名空间(要求php5.3以上)FlashBuilder 4.6 安装方法及步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

3DESC加密算法

3DESC 请求参数和响应参数全采用3des加密规则,由于我是用.NET对接的,而第三方是Java开发的,所以两种程序之间采用的算法有一点差异,java的3des加密采用的是"DESede/CBC/PKCS5Padding"规则,所以对应的C#规则是"PaddingMode.PKCS7和CipherMode.CBC",使用CBC模式的话在C#下必须传入加密...

C#下的BMP图像压缩类

这几天研究比较多,其中一个成果就是下面这个图像压缩类。可以把BMP文件压成任意质量的JPEG,在.net framework 2.0下编译通过。有时间的话我会把它写成可以压缩其他格式的类,其实改一下参数就可以了。 时间原因没有写注释,(不过这个类真够简单了)还是介绍一下吧: 只有一个没有重载的构造函数,参数是待压缩BMP文件的路径,还有一个长整形的质量参数...

照片上传(缩略图实现)

1.获取所有的提交到服务器的文件集合 HttpFileCollection fileColl= Request.Files; 2.取得一个文件(这里是一张照片)     HttpPostedFile pic = fileColl[0]; 3.判断文件是否为空     1.获取服务器存放图片的物理路径(Server.MapPath)        strin...

C#中ASCII码学习心得

1.利用调用ASCIIEncoding类来实现各种转换。如简单个ACS码和int转换。 ***利用(int)ASCIIEncoding类对象.GetBytes(character)[0]得到整数; public static int Asc(string character){if (character.Length == 1){ System.Text....

python字符编码、字符串格式化、字符串方法、列表、元组、字典、集合等基础知识总结

目录: 一、字符编码 二、字符串格式化 三、进制转换 四、数据类型及其操作 1.int类、2.str类 五、格式转换 六、For循环 七、三元运算 八.列表 九、列表推导式 十、元组 十一、字典 十二、集合set 十三、文件操作 十四、变量指向和深浅拷贝 一.字符编码: 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数...

asp.net core网关Ocelot的简单介绍& Ocelot集成Identity认证

文章简介  Ocelot网关简介  Ocelot集成Idnetity认证处理 Ocelot网关简介 Ocelot是一个基于netcore实现的API网关,本质是一组按特定顺序排列的中间件。Ocelot内部实现了路由转发,限流,熔断,请求聚合,服务发现(集成consul,eureka等),负载均衡,认证(集成Identity)功能。 这里简单介绍下ocel...