Objective-C-Tutorials

NSArray

不可变数组。OC中的集合不再是单纯的数组,而范围了三大类:数组、字典、集。

学习数组,首先明白一下几个内容:

  • 数组分为不可变数组(NSArray)与可变对象(NSMutableArray);
  • 只能装对象,基本数据类型包装成NSNumber,复杂类型包装成NSValue;
  • nil作为结束标示;
  • 下标从0开始;
  • 数组中的元素不一定为一个类型,可以存在NSString,也可以存在NSNumber

常用方法

与不可变字符串NSString类似,不可变数组NSArray操作也不在原数组上进行,而是通过返回一个新的数组来操作。

初始化

简化操作

NSArray *array1 = @[@"1", @"2", @"3"];

实例方法

// 按元素初始化(常用)
NSArray *array2 = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", nil];

// 按已有的数组进行初始化(初始化出来和array1的元素相同)
NSArray *array3 = [[NSArray alloc] initWithArray:array1];

遍历构造

NSArray *array4 = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
NSArray *array5 = [NSArray arrayWithArray:array1];

获取数组元素个数

获取数组元素个数的方法与NSString获取长度有区别,使用的是count,而不是length

NSUInteger count1 = [array1 count];
NSUInteger count2 = array1.count;

添加元素

// 从尾部追加一个元素
NSArray *array6 = [array1 arrayByAddingObject:@"4"];

// 从尾部依次追加array2中的元素
NSArray *array7 = [array1 arrayByAddingObjectsFromArray:array2];

查找元素

是否包含某元素

BOOL isContain = [array2 containsObject:@"1"];

元素具体位置

查找并返回元素的具体位置,如果没找到,返回NSNotFound。

NSUInteger index = [array2 indexOfObject:@"2"];
NSLog(@"是否找到 = %d", index == NSNotFound);

获取元素

存入的是什么类型,取出的时候,就需要什么类型去接收

根据下标获取元素

// 两种取值方式等价
NSString *string1 = array2[0];
NSString *string2 = [array2 objectAtIndex:0];
// 取出一个与最后一个元素
NSString *string3 = [array2 firstObject]; // 第一个元素
NSString *string4 = [array2 lastObject];  // 最后一个元素

截取部分元素

通过给定范围,截取数组元素中的部分元素,存入新数组。

NSArray *array8 = [array2 subarrayWithRange:NSMakeRange(0, 2)];

数组排序

一般的字符串数组排序会使用到NSString提供的compare:caseInsensitiveCompare:方法,然后调用sortedArrayUsingSelector达到对array2中,存储的字符串进行排序的目的。

NSArray *array9 = [array2 sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

注意上面写法的几点要求:

  1. array2数组中存储的全是字符串;
  2. 比较大小需要传的@selector类型中,caseInsensitiveCompare是字符串中的方法;
  3. 这里选择器@selector返回值类型必须是NSComparisonResult

根据这几点要求,我们可以写出自己的比较大小的方法,练习如下:

  1. 创建一个Person类;
  2. Person类有一个成员变量name
  3. 初始化多个Person,并给出不同的name值;
  4. 将初始化出来的Person对象存入NSArray
  5. 根据name的大小,对Person进行升序排列。

实现如下:

1.创建Person类,并给出成员变量name,并实现响应的getter / setter方法;

2.为了输出方便,重写description方法,返回name; 3.