这个学习笔记基本上就是例子的集合,讲解的还是需要多看看相关的书籍,以下所有代码都是在xcode4.5下编译通过。
一、常用的数据类型
NSRange用来表示相关事物的范围,通常是字符串里的字符范围或者是数组里的元素范围。其定义如下
老版本定义:
typedef struct _NSRange{
unsigned int location;
unsigned int length;
}NSRange;
新版本定义
typedef unsigned long NSUInteger;
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
下面这个是NSRange结合NSString的一个例子:
int main(int argc,const char * argv[])
{
NSString *string = @"Objective-C is a cool language.";
NSRange range = {17,4};
NSLog([string substringWithRange:range]);
}
其他常用的结构体:NSPoint,NSRect,NSSize。。。。
二、字符串NSString和NSMutableString
NSString是不可变的,NSSMutableString是不可变的,NSSMutableString是NSString的子类。
下面的例子展示了他们的一些基本用法:
int main(int argc,const char * argv[])
{
NSString *string = @"Objective-C is a cool language.";
NSRange range = {17,4};
NSLog([string substringWithRange:range]);
NSString *str;
str = [NSString stringWithFormat:@"you height is %d feet,%d inches",5,11];
NSLog(str,nil);
NSString *str2 = @"this is a string!";
if(![str isEqualToString: str2]){
NSLog(@"The strings are not same!");
}
if([str hasPrefix:@"you"]){
NSLog(@".....");
}
NSRange range2;
range2 = [str rangeOfString:@"feet"];
NSLog(@"range.location:%ld,range.length:%ld",range2.location,range2.length);
NSMutableString *mstr;
mstr = [NSMutableString stringWithCapacity:22];
[mstr appendString:@"hello "];
[mstr appendFormat:@"world!%d",1];
NSLog(mstr,nil);
[mstr deleteCharactersInRange:NSMakeRange(12, 1)];
NSLog(mstr,nil);
return (0);
}
三、集合类
集合类只能存储Objective-C的对象,不能储存C语言中的基本数据类型,如int,float
1.NSArray和NSMutableArray
NSArray是不可变数组,NSMutableArray是可变数组。不可变的意思是在初始化之后不能添加和删除任何元素,但是数组中包括的对象是可以改变的。
int main(int argc,const char * argv[]) { NSArray *array; array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil]; //根据索引取数组中的对象 int i; for(i = 0;i < [array count];i++){ NSLog(@"index %d has %@",i,[array objectAtIndex:i]); }
} 2.NSEnumberator和快速迭代return (0);
NSEnumberator需要先向数组请求枚举器:-(NSEnumberator *)objectEnumberator;int main(int argc,const char * argv[]) { NSArray *array; array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil]; //根据索引取数组中的对象 int i; for(i = 0;i < [array count];i++){ NSLog(@"index %d has %@",i,[array objectAtIndex:i]); } //通过使用NSEnumberator遍历数组元素 NSEnumerator * enumerator = [array objectEnumerator]; id thingie; while(thingie = [enumerator nextObject]){ NSLog(@"I found %@" ,thingie); } //使用快速迭代遍历元素 for(NSString *string in array){ NSLog(@"I found %@",string); } }
3.NSDictionary和NSMutableDictionary
字典就是关键字及其定义的集合,在可变字典中关键字须唯一,如果插入的新记录的关键字存在,那么新值会替换原有数值。4.NSNumberint main(int argc,const char * argv[]) { NSString *str1 = @"one"; NSString *str2 = @"two"; NSString *str3 = @"three"; NSDictionary *dict; dict = [NSDictionary dictionaryWithObjectsAndKeys:str1,@"one",str2,@"two",str3,@"three", nil]; //使用快速迭代 for(NSString *string in dict){ NSLog(@"the key is %@,the value is %@",string,[dict objectForKey:string]); } //使用枚举器遍历 NSString *string; NSEnumerator *enumerator; while(string = [enumerator nextObject]){ NSLog(@"the value is %@",string); } return (0); }
使用NSNumber类来包装基本数据类型。int main(int argc,const char * argv[]) { NSMutableArray *array; NSMutableDictionary *dict; NSNumber *number = [NSNumber numberWithInt:20]; //将对象放入数组和字典中 [array addObject:number]; [dict setObject:number forKey:@"Bork"]; //获得基本类型数据 NSLog(@"the number is %d",[number intValue]); return (0); }
5.NSValue
NSValue是NSNumber的父类,可以包装任意值int main(int argc,const char * argv[]) { NSMutableArray *array; NSRect rect = NSMakeRect(1, 1, 30, 40); NSValue *value1 = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)]; [array addObject:value1]; // NSValue *value2 = [array objectAtIndex:0]; [value2 getValue:&rect]; return (0); // NSValue *value3 = [NSValue valueWithRect:rect]; [array addObject:value3]; return (0); }
6.综合小例子:查找文件
查找用户主目录下的所有.jpg文件int main(int argc,const char * argv[]) { //创建一个文件管理器,用它来返回一个目录迭代器 NSFileManager *manager; manager = [NSFileManager defaultManager]; //~表示当前用户的主目录,stringByExpandingTildeInPath可以接受~并转换成NSStrng NSString *home; home = [@"~" stringByExpandingTildeInPath]; //获得目录迭代器 NSDirectoryEnumerator *direnum; direnum = [manager enumeratorAtPath:home]; //创建保存文件所需的可变数组,指定长度为30,这个长度并不限制容器的大小,只是个最优值 NSMutableArray *files; files = [NSMutableArray arrayWithCapacity:30]; //迭代查找后缀为jpg的文件,将文件名储存到filename中 //pathExtension输出文件的扩展名,不包括前面的“.” NSString *filename; while(filename = [direnum nextObject]){ if([[filename pathExtension] isEqualTo:@"jpg"]){ [files addObject:filename]; } } //使用迭代器输出文件名 NSEnumerator *fileenum; fileenum = [files objectEnumerator]; while(filename = [fileenum nextObject]){ NSLog(@"%@",filename); } return (0); }
下面这个程序实现了同样的功能,只是简化了
int main(int argc,const char * argv[]) { NSFileManager * manager = [NSFileManager defaultManager]; NSString *home = [@"~" stringByExpandingTildeInPath]; NSMutableArray * files = [NSMutableArray arrayWithCapacity:20]; for(NSString *filename in[manager enumeratorAtPath:home]){ if([[filename pathExtension] isEqualTo:@"jpg"]){ [files addObject:filename]; } } for(NSString *filename in files){ NSLog(@"%@",filename); } return (0); }