iOS学习笔记之 Objective-C (三)
这篇文章我们讲讲 OC
中的类型。
上一篇文章已经说了,OC是对C的扩展,因此可以直接使用C中的类型:
long l;int i;float f;double f2;bool isTrue;void m;struct { int score; char id; } student;// ...
接下来介绍 Foundation
框架中给我们带来的新的类型:
布尔型 BOOL
注意大小写,这不是C中的 bool
,不知道这个类型的定义是否是多此一举。
它有 YES
和 NO
两个值,顾名思义。我们知道,C中定义真假,无非是0或非0,并且它可以喝数值相互转换,但 BOOL
显然不行。
内存中, YES
和 NO
是八位的,值如下:
YES:00000001 NO :00000000
当使用 BOOL
与数值比较时,只有数值的低位会参与比较,从而得出不准确的结果,所以千万不要这么做。下面上一段官方的example:
#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
本身就提供了很多有用的方法,我们看代码:
//...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]; // YESBOOL 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,如不存在,为-1int 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 *String1 = [[NSMutableString alloc] initWithString:@"This is a NSMutableString"];