这篇文章咱们讲讲 OC
中的类型。html
上一篇文章已经说了,OC是对C的扩展,所以能够直接使用C中的类型:java
long l; int i; float f; double f2; bool isTrue; void m; struct { int score; char myId; } student; // ...
接下来介绍 Foundation
框架中给咱们带来的新的类型:python
BOOL
注意大小写,这不是C中的 bool
,不知道这个类型的定义是不是画蛇添足。
它有 YES
和 NO
两个值,顾名思义。咱们知道,C中定义真假,无非是0或非0,而且它能够喝数值相互转换,但 BOOL
显然不行。
内存中, YES
和 NO
是八位的,值以下:程序员
YES:00000001 NO :00000000
当使用 BOOL
与数值比较时,只有数值的低位会参与比较,从而得出不许确的结果,因此千万不要这么作。下面上一段官方的example:objective-c
#import <Foundation/Foundation.h> BOOL areIntsDifferent(int thing1,int thing2) { if(thing1==thing2) { return NO; } else { return YES; } } NSString *boolString(BOOL yesNo) { if(yesNo == NO) { return @"NO"; } else { return @"YES"; } } int main(int argc, const char * argv[]) { BOOL areTheyDifferent; areTheyDifferent = areIntsDifferent(5, 5); NSLog(@"Are %d and %d different? %@",5,5,boolString(areTheyDifferent)); areTheyDifferent = areIntsDifferent(23,42); NSLog(@"Are %d and %d different? %@",23,42,boolString(areTheyDifferent)); return 0; }
NSString
为区别于 C 中的 string
字符串, NSString
字符串会在 双引号前加 @
,前文中咱们已经看到了。编程
类 NSString
自己就提供了不少有用的方法,咱们看代码:segmentfault
//... NSString *string1 = [[NSString alloc] init]; // 构造空字符串 NSString *string2 = [[NSString alloc] initWithString:@"This is a String!"]; // 构造字符串 NSString *string3 = @"This is also a String!"; string1 = @"This is the first String!"; // 常量字符串,这个最简单。 /* 将C中的string类型赋过来 */ char *Cstring = "This is a String!"; NSString *cString = [[NSString alloc] initWithCString:Cstring]; NSLog(@"astring:%@,%@",string1,string2); [astring release]; //...
NSString *stringFormat = [[NSString alloc]initWithFormat:@"This is a formated string ,number %i",1]; NSLog(@"Format:%@",stringFormat);
对了,EcmaScript 6 已经引进了跨行字符串以及格式化字符串,有兴趣的同窗能够谷歌一下!数组
NSString *string01 = @"This is a String!"; NSString *string02 = @"This is a String!"; NSString *astring01 = @"This is a String!"; NSString *astring02 = @"this is a String!"; /* 判断二者内容是否相同,下面两种方法均可以: */ BOOL isEqual = [string01 isEqualToString:string02]; // YES BOOL compare1 = [string01 compare:string02] == NSOrderedSame; /* NSOrderedAscending判断两对象值的大小:按字母顺序进行比较,astring02大于astring01为YES */ BOOL compare2 = [astring01 compare:astring02] == NSOrderedAscending; /* NSOrderedDescending判断两对象值的大小:按字母顺序进行比较,astring02小于astring01为真 */ BOOL result = [astring01 compare:astring02] == NSOrderedDescending;
NSString *string1 = @"This is a string"; NSString *string2 = @"is a"; NSRange range = [string1 rangeOfString:string2]; /* NSRange 类型其实是一个C的结构体,不要被这个不明觉厉的东东吓到 struct { int location; int length; } NSRange; */ int location = range.location; // 包含字符串所在的起始位置,这里的值为5,如不存在,为-1 int leight = range.length; // 长度,这里的值为4,如不存在,为0
NSString *string0 = @"This is a string"; // 1.从字符串的开头一直截取到指定的位置,但不包括该位置的字符 NSString *string1 = [string0 substringToIndex:3]; NSLog(@"string1:%@",string1); // string1:Thi // 2.以指定位置开始(包括指定位置的字符),并包括以后的所有字符 NSString *string2 = [string0 substringFromIndex:3]; NSLog(@"string2:%@",string2); // string2:s is a string // 3.按照所给出的位置,长度,任意地从字符串中截取子串 NSString *string3 = [string0 substringWithRange:NSMakeRange(0, 4)]; /* NSMakeRange 顾名思义,建立一个NSRange类型的结构体 */ NSLog(@"string3:%@",string3); // string3:This
OC这种静态语言,中的不少引用类型(这么说合适么?)的 内存空间都是固定的、内存空间都是固定的、内存空间都是固定的,对于习惯了 js 和 python 的程序员们,重要的事情说三遍!
因此嘞,什么NSString类型啊,以及咱们后面要讲的NSArray、NSSet这类东西长度都是固定的。固然OC也提供了长度可变的相应类型,后者通常是前者的子集,例如:NSMutableString
NSMutableArray
。想要修改字符串,就要用到这种类型。app
NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"This is a NSMutableString"]; // 1. 把一个字符串接在另外一个字符串的末尾 [string1 appendString:@", I will be adding some character"]; [string1 appendFormat:[NSString stringWithFormat:@",%i",100]]; NSLog(@"string1:%@",string1); // 2. 在指定位置插入字符串 [string1 insertString:@"Hi! " atIndex:0]; // 3. 替换原有内容 NSMutableString *setString1 = [string1 setString:@"Hello World!"]; // 4.用指定字符串替换字符串中某指定位置、长度的字符串 [string1 replaceCharactersInRange:NSMakeRange(0, 4) withString:@"That"]; // That is a NSMutableString // 5.检查字符串是否以另外一个字符串开头或结尾 NSString *fileName = @"NSStringInformation.txt"; [fileName hasPrefix:@"NSString"] = = 1 ? NSLog(@"YES") : NSLog(@"NO"); [fileName hasSuffix:@".txt"] = = 1 ? NSLog(@"YES") : NSLog(@"NO");
NSNumber
它其实是一种数值对象,但咱们通常仍然使用C语言中的数值类型。下面代码仅简单演示一下用法:框架
NSNumber *number = [NSNumber numberWithInt:123]; // 建立一个整型值 // 或使用构造方法 [[NSNumber alloc] initWithInt:123] NSLog(@"%i",[number intValue]); // 或 NSLog(@"%@",number); /* 还有: [NSNumber numberWithBool]; ... numberWithChar ... numberWithFloat ... stringValue ... isEqualToNumber:(NSNumber *) aNSNumberVariable */
NSArray
和 NSMutableArray
OC中的数组有一个好,那就是它能够储存不一样类型的变量,而且, NSArray
不能保存基本类型(必须是引用类型——做者注:这个术语用在OC编程中并不严谨)。
若是须要将基本类型存储在 NSArray
数组中,上面的 NSNumber
就派上了用场。我一直以为 NSNumber
就像 python
或 java
里的包装器对象,能起到相似做用的类型还有 NSValue
、 NSDate
。
另外一个问题就是,不能将 nil
加入 NSArray
数组,由于这表明数组到此结束,若是须要加入一个空对象,请使用 NSNull
。
想要查看
Foundation
中提供的所有类型,请点击苹果官方文档。
仍是直接代码演示一遍:
NSArray *arr = [NSArray arrayWithObjects:@"Sep",@"Januay",@"April",nil]; /* 因为 nil 只表明数组结束,因此实际上数组有三个成员。 也能够直接赋值: NSArray *arr=@[@"Sep",@"Januay",@"April",nil]; */ for(int i = 0;i<[arr count];i++){ NSLog(@"%@ at count %i",name,i); } // count 即数组的长度,至关于 java数组中的length /* 咱们还能够用 for ... in 语法快速遍历数组, 与js中的 for ... in 语法不一样,OC对此进行了优化,实际上比for语法遍历数组的速度更快。 但后者的缺点是不能对数组成员进行修改、删除操做,不然编译器将报错。 */ // 返回数组指定下标的成员: NSString *str0 = [arr objectAtIndex:0]; // 或 NSString *str0 = arr[0]; // 返回数组个数 NSLog(@"arr count :%d", [ar count]); // 追加成员并返回新的array对象 NSArray *arr2 = [arr arrayByAddingObject:@"August"]; NSLog(@"arr2 :%@", arr2); // 是否包含指定对象 NSLog(@"isContains :%d", [arr containsObject:@"April"]); // 查找某个成员所在索引,若成员不存在则返回-1 NSLog(@"indexOfObject :%d",[arr indexOfObject:@"August"]); // 返回第一个或最后一个元素 NSLog(@"firstObject:%@,lastObejct :%@", [arr firstObject] , [arr lastObject]); // ...
到目前为止,所介绍的经常使用到的 Foundation
类依然是比较少的,咱们会在后面的文章中继续介绍。
结尾插个话:我发现 OC
中好像并无严格意义上的方法重载,咱们注意到, OC
的方法名老是由于行参变化而改变,实际上就是两个不一样的方法。
本文的内容忽略了一个问题:内存引用计数的问题,由于前两篇文章已经说了,OC的内存管理须要手动管理, java
和 python
中则不存在这个问题。咱们在后面的内容中再讨论吧。
参考文档: