Objective-C中的集合类:
1. 数组 NSArray
在Objective-C中的集合类中主要包括不可变的数组--NSArray, 可变的数组--NSMutableArray,
不可变的字典--NSDictionary, 可变的字典--NSMutableArray,
不可变的集合--NSSet , 可变的集合--NSMutableSet
1>. 不可变的数组 NSArray
数组是有序对象的集合,用来存储对象的有序列表,在OC中数组中必须存的是对象,不能是基本数据类型,若想存入基本数据类型,必须先把数据类型转换成对象,然后再存入集合类中。 NSArray也是OC中的一个对象,使用NSArray也需要进行实例化,
(1). NSArray的初始化:
- NSArray的便利初始化函数: -(id) initWithObjects : (id) firstObject, ....;
- NSArray的便利构造器: +(id) arrayWithObjects: (id) firstObject, ...;
-
//NSArray的便利初始化 NSArray *array1 = [[NSArray alloc] initWithObjects:@"aaa", @"bbb", @"ccc", nil]; //NSArray的便利构造器 NSArray *array2 = [NSArray arrayWithObjects:@"111", @"222", @"333", nil];
(2). 获取数组元素的个数和数组的元素
-(NSUInteger) count; 获取数组元素的个数
-(id) objectAtIndex : (NSUInteger) index;
int count = (int)[array1 count]; id element = [array1 objectAtIndex:0]; NSLog(@"array1_count = %d, array[0] = %@",count, element); //对Array1的元素进行遍历 for(int i = 0; i < [array1 count]; i++){ id temp = [array1 objectAtIndex: i]; NSLog(@"%@",temp); }
2>. 可变的数组NSMutableArray
NSArray的容量是固定的,而NSMutableArray的容量是可变的,我们可以在NSMutableArray实例化的时候先初始化一个容量,不过这个容量不是固定的,不够的时候会自动增加。NSMutableArray是NSArray的子类,是对NSArray的一个扩充。
(1) NSMutableArray的初始化
NSMutableArray的便利初始化函数:-(id) initWithCapacity : (NSUInteger) numItems;
NSMutableArray的便利构造器:+(id) arrayWithCapacity: (NSUInteger) numItems;
(2) 元素的添加和删除
增加元素: -(void) addObject: (id) anObject; --往数组的尾部添加元素
删除全部内容: -(void) removeAllObjects;
删除最后一个元素: -(void) removeLastObject;
通过索引删除元素: -(void) removeObjectAtIndex: (NSUInteger) index;
删除任意一个元素: -(void) removeObject : (id)object;
(3) 元素的插入和替换
通过数组的索引来进行元素的替换:-(void) replaceObjectAtIndex :(NSUInteger) index withObject: (id) anObject;
在指定索引处插入对象:-(void) insertObject : (id) anObject atIndex : (NSUInteger) index;
array1 = [NSMutableArray arrayWithObjects:@"111", @"222", @"333", nil]; [array1 replaceObjectAtIndex: 0 withObject:@"aaa"]; NSLog(@"%@", array1); [array1 insertObject:@"RanJin" atIndex: 1];
(4) 数组的遍历
(此处使用枚举器和快速枚举)
1>. 枚举器(迭代器):要通过NSEnumerator来遍历数组首先得通过-(NSEnumerator *) objectEnumerator来得到枚举器;通过枚举其中的nextObject来获取对象.
//获取枚举器 NSEnumerator *enumerator = [array1 objectEnumerator]; //临时变量 id obj; while (obj = [enumerator nextObject]) { NSLog(@"%@", obj); }
2>. 快速遍历法,相当于PHP中的foreach的用法
for(id obj in array1){ NSLog(@"%@", obj); }
2. 字典(Dictionary)
字典就像java中的Map, 里面存的是键值对,key的值是不可以重复的。字典有可改变的和不和不可改变之分。
1.不可变字典NSDictionary
(1) 字典的创建和获取字典的值
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];//不可变字典的初始化(注意顺序) id value = [dictionary objectForKey: @"key1"];//获取字典的值 NSLog(@"The value of the key1 is %@", value);
(2) 字典的遍历
字典的遍历方法是通过字典里的-(NSArray *)allKeys获取所有的key存入数组中然后通过遍历数组获取key对应的value,封装成函数如下:
NSArray *keys = [dictionary allKeys]; for(id obj in keys){ NSLog(@"%@==>%@", obj, [dictionary objectForKey: obj]); }
2. 可变字典NSMutableDictionary
在使用可变字典NSMutableDictionary时可以先给可变字典初始化一个空间,如果不够的话会自动增加
给可变字典分配初始化空间: +(id) dictionaryWithCapacity : (NSUInteger) num;
给可变字典添加对象:-(void) setObject(id) obj forKey(id) aKey;
根据关键字删除对象:-(void) removeObjectForKey : (id) aKey;
删除字典中的所有数据: -(void) removeAllObjects;
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity: 3]; //添加元素 [dictionary setObject:@"CEO" forKey:@"Nick"]; [dictionary setObject:@"Manager" forKey:@"Isabel"]; [dictionary setObject:@"CTO" forKey:@"Nicole"]; NSLog(@"%@", dictionary); //移除元素 [dictionary removeObjectForKey: @"Nick"]; NSLog(@"%@", dictionary);
3. set集合
? Set集合类就像我们数学中的集合一样是无序和不重复的,Set中也只能存放对象,也分为可变集合NSMutableSet和不可变集合NSSet。
出现了一个问题,记录下,我在接口文件中声明了array_display()方法,在实现文件中实现了这一方法,可是在main.m文件中,在new了一个array数组对象之后,为什么这个对象不能调用那个方法??而只能在main方法里去实现。
// array_display(setToArray);//为什么不起作用 NSEnumerator *enumerator = [setToArray objectEnumerator]; id obj; while (obj = [enumerator nextObject]) { NSLog(@"%@", obj); }
? 1.不可变集合NSSet
? ? ? ?(1)NSSet的初始化和其他集合类一样也有其对应的便利初始化方法和便利构造器,
? ? ? ? ? ?便利初始化方法:-(id) initWithObjects: (id) firstObject, ...;
? ? ? ? ? ?便利构造器:+(id) setWithObjects: (id) firstObject, ...;
? ? ? ?(2)NSSet中也有-(NSUInteger) count 来获取元素的对象
? ? ? ?(3) 获取集合中的元素
? ? ? ? ? 获取全部的集合元素,以数组的形式返回:-(NSArray *) allObjects;
? ? ? ? ? ?随进获取集合中的元素:-(id) anyObject;
? ? ? ?(4)判断两个Set是否相同 : - (BOOL) isEqualToSet: (NSSet *) otherSet;
? ? ? ?(5)判断一个元素是否在本集合中 -(BOOL) member: (id) obj;
? 2、可变Set: NSMutableSet
? ? ?1.可变集合的实例化和初始化
? ? ? ?便利初始化函数: -(id) initWithCapacity :(NSUInteger) numItems;
? ? ? ?便利构造器:+(id) setWithCapacity: (NSUInteger) numItems;
? ? ? 2.往可变集合中添加元素
? ? ? ?-(void) addObject : (id) object;
? ? ?3.删除集合中的对象
? ? ? ?-(void) removeAllObjects; 删除所有的对象;
? ? ? ?-(void) removeObjects: (id) object 删除其中某一个对象;
//便利初始化函数分配大小 NSMutableSet *set01 = [[NSMutableSet alloc]initWithCapacity: 3]; NSMutableSet *set02 = [NSMutableSet setWithCapacity:3]; //添加元素 [set01 addObject:@"aa"]; [set01 addObject:@"bb"]; [set01 addObject:@"cc"]; NSArray *array = [set01 allObjects]; NSEnumerator *enumerator = [array objectEnumerator]; id obj; while (obj = [enumerator nextObject]) { NSLog(@"%@", obj); }
Finally:把基本数据类型包装成对象
?前面不止一次的提到在OC中的集合类中是不能放基本数据类型的,那么我们如何把基本数据类型封装成对象呢? 在OC中给我们提供啦一个类专门来把基本数据类型封装成对象,这个类就是NSNumber.
?1. NSNumber的用法如下(还没在代码中测过。只是把别个写的copy过来了,供自己以后学习。)
? ? ? ?把基本类型包装成对象的便利构造函数
? ? ? ? ?-(id) initWithChar : (char) value;
? ? ? ? ?-(id) initWithInt : (int) value;
? ? ? ? ?-(id) initWithFloat : (float) value;
? ? ? ? ?-(id) initWithBool: (BOOL) value;
? 把基本数据类型包装成对象的便利构造器
? ? ? ? ?+(id) numberWithChar : (char) value;
? ? ? ? ?+(id) numberWithInt : (int) value;
? ? ? ? ?+(id) numberWithFloat : (float) value;
? ? ? ? ?+(id) numberWithBool : (BOOL) value;
? 从NSNumber中获取值
? ? ? ? ?-(char) charValue; ? ?-(int) intValue; ?-(float) floatValue; ? (BOOL) boolValue; ?(NSString *) stringValue;
2、在集合类中是不可以存储nil(空的),因为nil作为nil的结束符,那么我们如何来存储空对象呢?该NSNull出场啦,其功能是把null包装成对象,
? ? ? ? ?+(NSNull *) null;