iOS开发-NSArray
忙了一上午,解决了几个bug,现在终于抽出来一点时间喝点水休息下, 想着系列这么浩大的一个工程,才刚刚开始写,不能断了,就跟写小说一样,既然是系列,那么就需要不停更... 好吧. 简单的说说iOS开发中的数组-NSArray 首先 OC的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。 类似于之前说的字符串一样,OC的数组也有两种,可变数组和不可变数组 一步一步来, 首先是NSArray的创建 我们可以从NSArray的类里面看到很多类方法的创建和实例方法的创建 @interface NSArray<ObjectType> (NSArrayCreation) + (instancetype)array; + (instancetype)arrayWithObject:(ObjectType)anObject; + (instancetype)arrayWithObjects:(const ObjectType [])objects count:(NSUInteger)cnt; + (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION; + (instancetype)arrayWithArray:(NSArray<ObjectType> *)array; - (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION; - (instancetype)initWithArray:(NSArray<ObjectType> *)array; - (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag; + (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path; + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url; - (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path; - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url; @end 复制代码 我们仿照着之前NSString的方式,随便列举一些例子看看, //init NSArray *arr1 = [[NSArray alloc]init]; NSLog(@"%@",arr1); //array NSArray *arr2 = [NSArray array]; NSLog(@"%@",arr2); //arrayWithObject NSArray *arr3 = [NSArray arrayWithObject:@"arr3"]; NSLog(@"%@",arr3); //arrayWithObjects: NSArray *arr4 = [NSArray arrayWithObjects:@"arr4",@"arr4", nil]; NSLog(@"%@",arr4); NSArray *arr5 = @[@"arr5",@"arr5",@"arr5",@"arr5",@"arr5"]; NSLog(@"%@",arr5); //initWithObjects: NSArray *arr6 = [[NSArray alloc]initWithObjects:@"arr6",@"arr6", nil]; NSLog(@"%@",arr6); //arrayWithArray: NSArray *arr7 = [NSArray arrayWithArray:arr6]; NSLog(@"%@",arr7); 当然创建的方式不单单这些,比如从文件里面读取数组,网络访问返回的数组... 这些都在具体的例子中再对应创建... 接下来再说说NSArray的一些常用方法. //常用方法 //count (读取数组元素个数) NSLog(@"%ld",[arr7 count]); //objectAtIndex: (读取下标对应的元素,,,也可以用[] C的方式直接读取) NSLog(@"%@,%@",[arr7 objectAtIndex:0],arr7[0]); //arrayByAddingObject: (追加一个元素,返回新的数组) NSArray *arr8 = [arr7 arrayByAddingObject:@"arr8"]; NSLog(@"%@",arr8); //arrayByAddingObjectsFromArray: (追加多个元素,返回新的数组) NSArray *arr9 = [arr8 arrayByAddingObjectsFromArray:arr7]; NSLog(@"%@",arr9); //componentsJoinedByString: (使用某字符串合并数组元素成一个新的字符串) NSLog(@"%@",[arr9 componentsJoinedByString:@"-"]); //containsObject: (数组中是否有某元素) NSLog(@"%d",[arr9 containsObject:@"arr9"]); //indexOfObject (某元素对应的下标) NSLog(@"%ld",[arr9 indexOfObject:@"arr8"]); //indexOfObject:inRange: (对应范围内的某元素的下标) NSLog(@"%ld",[arr9 indexOfObject:@"arr8" inRange:NSMakeRange(0, arr9.count)]); //isEqualToArray: (两个数组是否相等) NSLog(@"%d",[arr9 isEqualToArray:arr8]); //firstObject (第一个元素) NSLog(@"%@",[arr9 firstObject]); //lastObject (最后一个元素) NSLog(@"%@",[arr9 lastObject]); //objectsAtIndexes (对应的多个下标的多个元素) NSLog(@"%@",[arr9 objectsAtIndexes:[NSIndexSet indexSetWithIndex:1]]); //数组遍历 //for循环 for (int i = 0; i<arr9.count; i++) { NSLog(@"%@",arr9[i]); } //for in for (id obj in arr9) { NSLog(@"%@",obj); } //迭代器 NSEnumerator *enumerator = [arr9 objectEnumerator]; id obj = nil; while(obj = [enumerator nextObject]){ NSLog(@"%@",obj); } //block [arr9 enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSLog(@"%ld-%@",idx,obj); //若终断循环 //*stop = YES; }]; 当然以上的方法都是一些基础的方法,经常会在项目中使用的方法..还有些不常用的和系统没有提供的需要在平时开发中再做积累, 当然我刚刚也说了数组的遍历,上面也举例了几个,后期我会单独对其进行分析,比较各自的优缺点和性能.这里暂不描述 接下来学习的是NSArray的子类 可变数组NSMutableArray 还是类似的学习方式,创建+常用方法 首先是创建 //init NSMutableArray *arr10 = [[NSMutableArray alloc]init]; NSLog(@"%@",arr10); //array NSMutableArray *arr11 = [NSMutableArray array]; NSLog(@"%@",arr11); //arrayWithCapacity: (创建初始长度为多少的数组,但因为其实可变数组,所以即使长度不够什么的,也没有关系,比如可以设0) NSMutableArray *arr12 = [NSMutableArray arrayWithCapacity:0]; NSLog(@"%@",arr12); //initWithCapacity: NSMutableArray *arr13 = [[NSMutableArray alloc]initWithCapacity:0]; NSLog(@"%@",arr13); 复制代码 当然因为其作为NSArray的子类,所以NSArray创建的方式,它也都有 这里就不一一举例了 常用方法: //addObject: (添加一个元素) [arr13 addObject:@"arr13"]; NSLog(@"%@",arr13); //addObjectsFromArray: (添加一组元素) [arr13 addObjectsFromArray:arr9]; NSLog(@"%@",arr13); //insertObject:atIndex (在某下标插入某一个元素) [arr13 insertObject:@"arr" atIndex:0]; NSLog(@"%@",arr13); //removeLastObject (删除最后一个元素) [arr13 removeLastObject]; NSLog(@"%@",arr13); //removeObjectAtIndex: (删除某下标对应的元素) [arr13 removeObjectAtIndex:0]; NSLog(@"%@",arr13); //replaceObjectAtIndex:withObject (替换某下标的元素) [arr13 replaceObjectAtIndex:0 withObject:@"index"]; NSLog(@"%@",arr13); //exchangeObjectAtIndex:withObjectAtIndex: (替换两个下标对应元素) [arr13 exchangeObjectAtIndex:0 withObjectAtIndex:1]; NSLog(@"%@",arr13); //removeAllObjects (移除所有元素) [arr13 removeAllObjects]; NSLog(@"%@",arr13); [arr13 addObjectsFromArray:arr9]; //removeObject:inRange: (移除某范围内指定元素) [arr13 removeObject:@"arr" inRange:NSMakeRange(0, 1)]; NSLog(@"%@",arr13); //removeObject: (移除指定元素) [arr13 removeObject:@"arr8"]; NSLog(@"%@",arr13); //removeObjectsInArray: (删除某数组内存在的元素) [arr13 removeObjectsInArray:arr7]; NSLog(@"%@",arr13); //removeObjectsInRange: (删除指定范围内的元素) [arr13 removeObjectsInRange:NSMakeRange(0, 1)]; NSLog(@"%@",arr13); //setArray: (设置数组元素) [arr13 setArray:arr9]; //sortUsingSelector: (排序) [arr13 sortUsingSelector:@selector(compare:)]; 当然还是一样的,凡是NSAarray的方法,NSMutableArray也都是支持的,方法很多有很多没有,需要在开发中自己积累,当然百度,谷歌...也都是方法的来源.... 常用方法基本就是这些,其实复杂的,特殊需求的方法绝大多数也是基于这些演变而来... 至于上面也有说道排序, 大家都学过C语言,肯定都能脱口而出冒泡\选择\插入... 当然OC中也是有排序的方法的,sortUsingSelector: sortUsingComparator:等等,后续也会单独举例... 今天就到这里.. 接下来讲的是key-value 也就是OC中的NSDictionary... 我想大家也都知道了 可变,不可变..... Demo地址:github.com/spicyShrimp…