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:)];
注意上面写法的几点要求:
- array2数组中存储的全是字符串;
- 比较大小需要传的@selector类型中,
caseInsensitiveCompare
是字符串中的方法; - 这里选择器
@selector
返回值类型必须是NSComparisonResult
。
根据这几点要求,我们可以写出自己的比较大小的方法,练习如下:
- 创建一个
Person
类; Person
类有一个成员变量name
;- 初始化多个
Person
,并给出不同的name
值; - 将初始化出来的
Person
对象存入NSArray
; - 根据
name
的大小,对Person
进行升序排列。
实现如下:
1.创建Person
类,并给出成员变量name
,并实现响应的getter
/ setter
方法;
2.为了输出方便,重写description
方法,返回name
;
3.