Objective-C里面的集合主要包括:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionaryc#
首先,NSString,NSArray和NSDictionary都是不可变的,一经分配空间,长度是固定的。另外3个类是可变的,初始化后还能够动态增长空间,长度不固定。这几个类在初始化和相关操做上有必定的类似性,放在一块儿对比学习,能加深理解。数组和字典有一些特殊的地方须要注意,后面进行说明,先从初始化开始:数组
字面量建立:NSString *string = @"this is a string"; app
格式化建立:+ (id) stringWithFormat:(NSString *) format,...;oop
例如:NSString * str = [NSString stringWithFormat:@"Your age is %d,and your height is %d",26,140];学习
从前面的+号能够看出,这是一个类方法优化
方法一:- (BOOL) isEqualToString:(NSString *) aStringui
用来比较接收方和做为参数传递过来的字符串,返回一个BOOL(YES或NO)来表示两个字符串的内容是否相同,例如:this
NSString *thing1 = @"hello 5"; NSString *thing2 = [NSString:stringWithFormat:@"hello %d",5]; if([thing1:isEqualToString:thing2]) { NSLog(@"they are the same!"); }
thing1==thing2与[thing1 isEqualToString:thing2]的区别,==运算符只判断thing1和thing2的指针数值是否相同,即:他们是不是同一事物;后者用来判断两个字符串的内容是否相同spa
方法二:- (NSComparisonResult) compare: (NSString *) aString option: (NSStringCompareOptions) mask;指针
compare方法将接收对象和传递过来的字符串逐个进行比较,返回一个NSComparisonResult(枚举类型)来表示比较结果。NSComparisonResult的定义以下:
enum { NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending }; typedef NSInteger NSComparisonResult
参数option是一个掩位码,能够经过位或来添加标记,经常使用的标记以下:
若是你相比较字符串,须要忽略大小写并按字符个数进行排序,那么应该这么作:
if([thing1 compare:thing2 option:NSCaseInsensitiveSearch | NSNumerbicSearch] == NSOrderedSame) { NSLog(@"They match!"); }
起始处包含(以aString开头):- (BOOL) hasPrefix: (NSString *) aString;
结尾处包含(以aString结尾):- (BOOL) hasSuffix: (NSString *) aString;
内部包含(内部含有aString):- (NSRange) rangeOfString: (NSString *) aString;
rangeOfString方法返回的是一个NSRange结构体,封装来字符串匹配的位置和可以匹配的字符个数,例如:
NSString *fileName = @"draft-chapter.pages"; NSRange range = [fileName rangeOfString:@"chapter"]; //返回的range.location为6,range.length为7
若是传递的参数在接收字符串中没有找到,那么range.location则等于NSNotFound。
NSMutableString是NSString的子类,长度可变,相似于c#中的StringBuilder,声明以下:
+ (id) stringWithCapacity: (NSUInteger) capacity;
这里的capacity只是个建议值,实际字符串大小并不限于所提供的容量。
例如:
NSMutableString *string = [NSMutableString stringWithCapacity:50]; [string appendString:@"Hello there "]; [string appendFormat:@"human %d!",66]; //最后string的值为:"Hello there human 66!"
方法:- (void) deleteCharactersInRange:(NSRange) aRange;
NSMutableString *friends = [NSMutableString stringWithCapacity:50]; [friends appendString:@"James BethLynn Jack Evan"]; NSRange jackRange = [friends rangeOfString:@"jack"]; jackRange.length++; [friends deleteCharactersInRange:jackRange]; //最终结果:"James BethLynn Evan"
NSMutableString是NSString的子类,因此任何使用NSString的地方均可以用NSMutableString来代替,例如,咱们能够添加格式化字符串:
NSMutableString *string = [NSMutableString stringWithFormat:@"jo%dy",2]; //string的值为"jo2y"
NSArray是一个Cocoa类,它比C、C++数组强大的地方在于,NSArray能够保存任意类型的对象,好比字符串、自定义类型甚至其余数组或字典,可是请记住:NSArray只能保存对象,像int ,char,double等基本数据类型不能直接保存,须要经过转换成对象才能加入数组。另外,NSArray是不可变数组,一旦建立它的长度就固定下来来,不能添加和删除任何元素,固然数组中包含的对象是能够改变的,只不过数组对象自己是一直都不会变的。
NSArray的建立:
相关方法:
- (NSUInteger) count; //获取数组中对象的个数
- (id) objectAtIndex:(NSUInteger)index; //获取指定索引处的对象
还能够经过字面量访问数组,例如:id *myObject = array[1];咱们能够利用计数和取值来遍历数组中的对象:
//方式一 NSUInteger count = [array count]; for(NSUInteger i = 0; i < count; i++) { NSLog(@"index %d has %@.", i, [array objectAiIndex:i]); } //方式二 for(NSUInteger j = 0; j < count; j++) { NSLog(@"index %d has %@", j, array[j]); }
NSArray还有一种特别的建立方式,就是经过切分字符串,方法的声明以下:
- (NSArray) componentsSeparatedByString:(NSString *) separater;
例如:NSString *string = @"oop:ack:bork:greeble:ponies";
NSArray *chunks = [string componentsSeparatedByString:@":"];
还能够反过来用指定字符串来合并NSArray中的元素来建立字符串,例如:
string = [chunks componentsJoinedByString:@"+"]; //string的内容为:"oop+ack:bork+greeble+ponies"
NSMutableArray的建立:+ (id) arrayWithCapacity:(NSUInteger) numItems;
与NSMutableString中的stringWithCapacity方法同样,这里的容量只是一个建议值,当超出容量时可变数组可以动态的扩展空间。
尾部添加对象:- (void) addObject:(id) anObject;
指定索引处插入对象: - (void) insertObject:(id) anObject atIndex:(NSUInteger) index; //后面的元素向后移
删除指定索引处的对象: - (void) removeObjectAtIndex:(NSUInteger) index;
删除所有对象:- (void) removeAllObjects;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:17]; //建立 for(NSInteger i = 0; i < 4; i++) //在尾部添加四个对象 { Tire *tire = [Tire new]; [array addObject:tire]; }
Tire *t = [Tire new];
[array insertObject:t atIndex:1]; //在第二个位置处添加一个对象 [array removeObjectAtIndex:1]; //删除索引为1的对象,即:第二个对象
[array removeAllObjects];
和c#中的字典同样,Objective-c中的NSDictionary能在给定关键字(一般是一个NSString字符串)下存储一个数值,而后能够经过这个关键词来查找相应的数据。相对于数组,字典采用的是键查询的优化方式,它能够当即找出要查找的数据,而不须要遍历整个数组,对于频繁的查询和大型数据集来讲,使用字典比数组要快得多。
像NSString和NSArray同样,NSDictionary也是不可变的,在建立新的NSDictionary时,就要提供该字典所存储的所有对象和关键字。
基本操做:
一、建立方式一:经过字面量方式,使用相似@{key:value,...}的方法来定义
二、建立方式二:经过dictionaryWithObjectsAndKeys方法,该方法接受对象和关键字交替出现的序列,以nil值做为终止符号,定义以下:
+ (id) dictionaryWithObjectsAndKeys:(id) firstObject,...
三、获取字典中的数据方式一:使用objectForKey,接收一个关键字,经过该关键字来获取对应的数据,该方法定义以下:
- (id) objectForKey:(id) aKey;
四、获取字典中的数据方式二:dictionary[key];
示例代码以下:
1 Tire *tire1 = [Tire new]; 2 Tire *tire2 = [Tire new]; 3 Tire *tire3 = [Tire new]; 4 Tire *tire4 = [Tire new]; 5 NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:tire1,@"front-left",tire2,@"front-right",tire3,@"back-left",tire4,@"back-right",nil]; 6 //字面量方式 7 NSDictionary *tires = @{@"front-left":tire1,@"front-right":tire2,@"back-left":tire3,@"back-right":tire4}; 8 9 //获取方式一 10 Tire *tire = [tires objectForKey:@"front-left"]; 11 //获取方式二 12 Tire *tire = tires[@"front-left"];
能够经过向NSMutableDictionary类发送dictionary消息来建立新的NSMutableDictionary对象,也能够经过dictionaryWithCapacity:方法来建立带初始大小的可变字典对象,这个方法的定义以下:
+ (id) dictionaryWithCapacity:(NSUInteger) numItems;
与以前提到过的NSMutableString和NSMutableArray同样,在这里,字典的容量只是一个建议值,而不是对其大小的限制。
能够经过setObject:forKey:的方法来为字典添加元素,定义以下:
- (void) setObject:(id) andObject forKey:(id) aKey;
若是对字典中已有的关键字使用setObject:forKey:方法,那么这个方法将会用新值替换原有的数据。若是想删除一些关键字,可以使用removeObjectForKey:方法,定义以下:
- (void) removeObjectForKey:(id) aKey;
示例代码以下:
1 //建立词典对象,初始化长度为10 2 NSMutableDictionary *tires = [NSMutableDictionary dictionaryWithCapacity:10]; 3 // NSMutableDictionary *tires = [NSMutableDictionary dictionary]; 4 5 //动态添加元素 6 [tires setObject:tire1:forKey:@"front-left"]; 7 [tires setObject:tire2:forKey:@"front-right"]; 8 [tires setObject:tire3:forKey:@"back-left"]; 9 [tires setObject:tire4:forKey:@"back-right"]; 10 11 //删除元素 12 [tires removeObjectForKey:@"back-left"];