今天继续昨天的内容,上一篇讲述了OC当中的基本数据类型,这次要讲的是OC当中的集合数据类型, NSArray(数组)?NSDictionary(字典) NSSet(集合)这三种集合数据类型.
一.NSArray 和?NSMutableArray
1).NSArray
NSArray是一个集合数据类型,存储的对象必须为OC当中的对象类型(单数组中的数据类型不不一定要是单一对象类型,可以为多种类型并存),保存的对象类型为有序数据,可以按照数组当中的下标来对应取出数据.
1.初始化方法(五种最常用的初始化方法)
? ? NSArray *array0 = [[NSArray alloc] initWithObjects:@"11",@"dd",@(22), nil];
? ? NSArray *array1 = [[NSArray alloc] initWithArray:array0];
? ? NSArray *array2 = [NSArray arrayWithObjects:@"11",@"dd",@(22), nil];
? ? NSArray *array3 = [NSArray arrayWithArray:array2];
? ? NSArray *array4 = @[@"11",@"dd",@(22)]; //此种写法为语法糖的写法,其概念完全等价于上面的几种方法,只是写法简洁了一点,新手不推荐使用.还需要记住一点的是@[]这种写法创建的数组只可以是不可变数组(NSArray)
2.常用操作
? NSArray *array = [[NSArray alloc] initWithObjects:@"11",@"dd",@22, nil];
? ? //获取指定下标下的数组元素
? ? NSLog(@"%@",array[0]);
? ? NSLog(@"%@",[array objectAtIndex:0]);
? ? //获取数组中包含多少元素
? ? [array count];
? ? //获取数组中的所有元素
? ? for(NSInteger i =0; i < array.count; i ++) {
? ? ? ? NSLog(@"%@",array[i]);
? ? }
? ? //判断当前数组是否包含某元素
? ? [array containsObject:@"11"];
? ? //获取元素在当前数组中的下标
? ? NSUInteger index =? [array indexOfObject:@"11"];
? ? //快速遍历数组(需要注意的是快速遍历并不是按照一定顺序来进行的,而是快速的取出当前数组中所有的元素并展示的.)
? ? for(id object in array) {
? ? ? ? NSLog(@"%@",object);
? ? }
? ? [array firstObject];//获取第一个元素
? ? [array lastObject];//获取最后一个元素
2).NSMutableArray
1.初始化方法(六种最常用的方法)
? ? //以下四种方式对照NSArray去理解
? ? NSMutableArray *mArray0 = [[NSMutableArray alloc] initWithObjects:@"11",@"dd",@(22), nil];
? ? NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithArray:(NSArray *)mArray0];? ? ? //(NSArray *)mArray0这里是由于类型不匹配,要求的参数是不可变数组 这里强转了一下(class *)意思是强转为指定(class *)类型的对象.强转的使用在以后会单独讲解,现在只做了解.
? ? NSMutableArray *mArray2 = [NSMutableArray arrayWithObjects:@"11",@"dd",@(22), nil];
? ? NSMutableArray *mArray3 = [NSMutableArray arrayWithArray:(NSArray *)mArray2];
? ? //初始化可变数组并申请10个内存地址大小的内存空间(注意这里的10个内存大小并不是一成不变的,当你没用完时此对象指向的内存地址空间大小为10 当储存内容超过10以后系统会自动分配新的内存空间以供使用)
? ? NSMutableArray *mArray4 = [NSMutableArray arrayWithCapacity:10];
? ? //同样为初始化可变数组但是不指定初始内存空间大小
? ? NSMutableArray *mArray5 = [NSMutableArray array];
2.常用操作
? ? NSMutableArray *mArray = [[NSMutableArray alloc] initWithObjects:@"11",@"dd",@(22), nil];
? ? //添加元素
? ? [mArray addObject:@"cc"];
? ? //在指定位置添加元素
? ? [mArray insertObject:@"ss" atIndex:0];
? ? //删除元素
? ? [mArray removeObject:@"cc"];
? ? //删除指定位置的元素
? ? [mArray removeObjectAtIndex:0];
? ? //删除所有元素
? ? [mArray removeAllObjects];
? ? //删除最后一个元素
? ? [mArray removeLastObject];
? ? //修改数组某一元素的内容(两种方式一种是根据下标直接替换当前数组中的元素,另一种是直接按照下标取出元素并修改)
? ? [mArray replaceObjectAtIndex:0 withObject:@"yy"];//f根据下标直接替换元素
? ? mArray[0] =@"tt";//按照下标取出元素并修改
PS:可变数组和不可变数组的遍历方式都是相同的所以不过的介绍了.
二.NSDictionary 和 NSMutableDictionary
字典是OC当中最常用的集合对象类型,字典顾名思义的意思就是和日常中使用的字典是一个意思,字典集合当中存储的对象都是以键值对的形式存在的,所谓的键值对当中的键值得就是索引,值就是键对应的储存的数据.字典在正常的使用中就是以键来获取对应的值,要注意的是字典中的键是唯一的.不可能出现同样的两个键.
值得注意的地方是字典中的储存的数据对象都是无须的所以无法通过下标来取值,字典取值是通过键也就是索引来获取对应的数据.
1).NSDictionary
1.初始化方法
? ? NSDictionary *dic0 = [[NSDictionary alloc] initWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
? ? NSDictionary *dic1 = [[NSDictionary alloc] initWithDictionary:dic0];
? ? NSArray*keyArray =@[@"key0",@"key1"];
? ? NSArray*valueArray =@[@"value0",@"value1"];
? ? NSDictionary *dic2 = [[NSDictionary alloc] initWithObjects:valueArray forKeys:keyArray];
? ? NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
? ? NSDictionary *dic4 = [NSDictionary dictionaryWithDictionary:dic3];
? ? NSDictionary *dic5 = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
? ? //字典的语法糖写法 需要注意的是字典的语法糖写法是@{}这里是大括号 大括号中是以@"":@""为一个对象元素 对象之间是使用逗号分隔.语法糖初始化字典时一定要记住@"键":@"值",和上方的初始化是相反的.
? ? NSDictionary *dic6 = @{@"key0":@"value0",@"key1":@"value1"};
2.常用操作
? ? NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value0",@"key0",@"vallue1",@"key1", nil];
? ? //获取字典元素个数
? ? [diccount];
? ? //获取字典中的元素
? ? [dicobjectForKey:@"key0"];
? ? //遍历字典
? ? for(NSString*keyindic) {
? ? ? ? NSLog(@"%@",[dicobjectForKey:key]);
? ? }
? ? //获取字典的所有键
? ? [dicallKeys];
? ? //获取字典的所有值
? ? [dicallValues];
2).NSMutableDictionary
1.初始化方法
? ? NSMutableDictionary *mDic0 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
? ? NSMutableDictionary *mDic1 = [[NSMutableDictionary alloc] initWithDictionary:(NSDictionary *)mDic0];? ?//(NSDictionary *)mDic0这里是由于类型不匹配,要求的参数是不可变数组 这里强转了一下(class *)意思是强转为指定(class *)类型的对象.强转的使用在以后会单独讲解,现在只做了解.
? ? NSMutableDictionary *mDic2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
? ? NSMutableDictionary *mDic3 = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)mDic2];
? ??//初始化可变字典并申请10个内存地址大小的内存空间(注意这里的10个内存大小并不是一成不变的,当你没用完时此对象指向的内存地址空间大小为10 当储存内容超过10以后系统会自动分配新的内存空间以供使用)
? ? NSMutableDictionary *mDic4 = [NSMutableDictionary dictionaryWithCapacity:10];
? ? //同样为初始化可变字典但是不指定初始内存空间大小
? ? NSMutableDictionary *mDic5 = [NSMutableDictionary dictionary];
2.常用操作
? ? NSMutableDictionary *mDic0 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
? ? //添加元素
? ? /*
?? ? 需要注意的是这两种方法都是为字典中添加键值对的方法
?? ? setObject 中value的对象不能为空否则会报错,但是setValue中 value是可以为空的
?? ? 还有需要注意的一点是[NSNull null]这个代表的是创建了一个空的对象并不等价于nil
?? ? 当使用setValue时如果value为nil时会默认调用removeObjectForKey这个方法,所以当setValue的值为nil时并不会添加对象到字典中.
?? ? setValue中值应该为字符串类型
?? ? setObject中添加的值为任意对象类型.
?? ? forkKey中值必须为字符串类型.
?? ? */
? ? [mDic0setObject:@"value2" forKey:@"key2"];
? ? [mDic0setValue:@"value3" forKey:@"key3"];
? ? //删除元素
? ? [mDic0removeObjectForKey:@"key1"];
? ? //修改字典中的元素
? ? [mDic0setValue:@"value4" forKey:@"key0"];? //其实修改和添加调用的方法是一致的,不同点在于key如果key是字典中已经包含的元素就是修改,入不包含则为添加元素
? ? //获取字典中的元素
? ? [mDic0objectForKey:@"key0"];
? ? //删除所有元素
? ? [mDic0removeAllObjects];
三.NSSet和NSMutableSet
集合是OC当中的一个集合数据类型,其区别于Array不同点在于Array是有序存储的,而NSSet是无序的(所以NSSet是无法通过下标取值的),而且Array是不排重复元素的而NSSet是排重存储的.
1).NSSet
1.初始化方法
? ? NSSet *set0 = [[NSSet alloc] initWithObjects:@"111",@"111",@"222",@"222", nil];
? ? NSSet *set1 = [[NSSet alloc] initWithSet:set0];
? ? NSSet *set2 = [NSSet setWithObjects:@"111",@"111",@"222",@"222", nil];
? ? NSSet*set3 = [NSSetsetWithSet:set2];
? ? NSArray *array = @[@"111",@"111",@"222",@"222"];
? ? NSSet *set4 = [[NSSet alloc] initWithArray:array];
? ? NSSet*set5 = [NSSetsetWithArray:array];
? ? //需要注意的是初始化时为set赋的值为@"111",@"111",@"222",@"222",由于set是排重存储的所以set的最终储存结果为@"111",@"222",
2.常用操作
? ? NSSet *set0 = [[NSSet alloc] initWithObjects:@"111",@"222", nil];
? ? //取出set中的元素(由于set是无序存储所以无法指定某一元素进行提取)
? ? [set0anyObject];//随机打印set中的元素
? ? //遍历set
? ? for(idobjectinset0) {
? ? ? ? NSLog(@"%@",object);
? ? }
2).NSMutableSet
1.初始化方法
? ? NSMutableSet *set0 = [[NSMutableSet alloc] initWithObjects:@"111",@"222", nil];
? ? NSMutableSet *set1 = [[NSMutableSet alloc] initWithSet:set0];
? ? NSMutableSet *set2 = [NSMutableSet setWithObjects:@"111",@"222", nil];
? ? NSMutableSet *set3 = [NSMutableSet setWithSet:set2];
? ? NSArray*array =@[@"111",@"222"];
? ? NSMutableSet *set4 = [[NSMutableSet alloc] initWithArray:array];
? ? NSMutableSet *set5 = [NSMutableSet setWithArray:array];
? ??//初始化可变集合并申请10个内存地址大小的内存空间(注意这里的10个内存大小并不是一成不变的,当你没用完时此对象指向的内存地址空间大小为10 当储存内容超过10以后系统会自动分配新的内存空间以供使用)
? ? NSMutableSet *set6 = [NSMutableSet setWithCapacity:10];
? ? //同样为初始化可变集合但是不指定初始内存空间大小
? ? NSMutableSet *set7 = [NSMutableSet set];
2.常用操作
? ? NSMutableSet *set0 = [[NSMutableSet alloc] initWithObjects:@"111",@"222", nil];
? ? //添加元素
? ? [set0addObject:@"333"];
? ? NSArray*array =@[@"444",@"555"];
? ? [set0addObjectsFromArray:array];
? ? //删除元素
? ? [set0removeObject:@"222"];
? ? //删除所有元素
? ? [set0removeAllObjects];
本次OC当中的集合类型就算介绍完了,这里列出的是最为常用的一些初始化方法和使用方法,其内部还有很多的方法可以使用,具体的等有需求的时候再单独介绍.下一篇文章要介绍的是iOS开发的基础视图控件UIView.
喜欢的点个赞再走哈.