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];