NSArray:这是一个不可变数组类,特点是创建成功,内容不可变。而且只可以存放OC对象。比如int等类型不可以存放在NSArray创建的对象中。
1、创建
在NSArray的类中,有很多创建数组的方法。而常用的方法有下面几个:
类方法:
创建数组对象,没有元素
+ (instancetype)array;
创建数组对象,并且初始化一个元素。
+ (instancetype)arrayWithObject:(ObjectType)anObject;
创建数组对象,初始化对个元素,和指定数组长度
+ (instancetype)arrayWithObjects:(const ObjectType [])objects count:(NSUInteger)cat;
创建数组对象,初始化多个元素
+ (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;
NSArray *array = @[@"a", @"b", @"c", @1];
这种方式就直接创建了一个数组对象array并赋初始值。在上面定义的数组中,最后一个元素‘@1’,前面说到,OC的数组中,只能存储OC的对象,而int,float,double等都是C语言的基础数据类型,并非OC对象,想要存储的时候该如何处理?这里就是使用了NSNumber这个类型进行存储。
2、NSArray常用属性和方法
数组长度属性,用于获取数组长度
@property (readonly) NSUInteger count;
数组描述
@property (readonly, copy) NSString *description;
数组第一个元素,用于获取数组中的第一个元素
@property (nullable, nonatomic, readonly) ObjectType firstObject NS_AVAILABLE(10_6, 4_0);
数组最后一个元素,用于获取数组中的最后一个元素
@property (nullable, nonatomic, readonly) ObjectType lastObject;
代码示例:
NSArray *array = @[@"第一个元素", @"第二个", @"第三个", @1];
//打印数组长度
NSLog(@"数组长度:%lu", array.count);
//打印数组中第一个元素
NSLog(@"第一个元素:%@", array.firstObject);
//打印数组中最后一个元素
NSLog(@"最后一个元素:%@", array.lastObject);
//打印数组描述
NSLog(@"数组描述:%@", array.description);
输出结果:
2017-03-20 11:30:12.517 OCdemo[835:66233] 数组长度:4
2017-03-20 11:30:12.518 OCdemo[835:66233] 第一个元素:第一个元素
2017-03-20 11:30:12.519 OCdemo[835:66233] 最后一个元素:1
2017-03-20 11:30:12.519 OCdemo[835:66233] 数组描述:(
"\U7b2c\U4e00\U4e2a\U5143\U7d20",
"\U7b2c\U4e8c\U4e2a",
"\U7b2c\U4e09\U4e2a",
1
)
Program ended with exit code: 0
根据下标读取数组方法,返回数组中对应下标的元素
- (ObjectType)objectAtIndex:(NSUInteger)index;
根据元素获取元素在数组中的下标,返回下标数字
- (NSUInteger)indexOfObject:(ObjectType)anObject;
代码示例:
NSArray *array = @[@"第一个元素", @"第二个", @"第三个", @1];
//根据下标获取对应元素
NSString *string = [array objectAtIndex:2];
NSLog(@"对应元素:%@", string);
//获取元素在数组中的下标
NSInteger i = [array indexOfObject:@1];
NSLog(@"下标:%lu", i);
打印结果:
2017-03-20 11:34:23.702 OCdemo[885:68519] 对应元素:第三个
2017-03-20 11:34:23.703 OCdemo[885:68519] 下标:3
Program ended with exit code: 0
判断两个数组是否相同
- (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray;
代码示例:
NSArray *array = @[@"第一个元素", @"第二个", @"第三个", @1];
NSArray *array1 = @[@"第一个元素", @"第二个", @"第三个", @1];
BOOL isEql = [array isEqualToArray:array1];
if (isEql) {
NSLog(@"相同");
}else{
NSLog(@"不相同");
}
打印结果:
2017-03-20 11:36:04.916 OCdemo[895:69356] 相同
Program ended with exit code: 0
从文件中读取数组,类方法,path表示文件的地址
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
从网络接口中读取数组,类方法,url表示网络接口
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
从文件中读取数组,对象方法
- (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
从网络接口中读取数组,对象方法
- (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
给数组最后添加一个元素
- (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
给数组后面添加一个数组
- (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
注:上面这两个给数组中添加元素的方法,返回的是一个新的数组,和原来的数组并不再是同一个,这样才不会违背NSArray是不可变数组这个事实。代码示例:
NSArray *array = @[@"first boject", @"second object", @"third object", @1];
NSLog(@"原始数组:%@", array);
NSArray *array1 = [array arrayByAddingObject:@"new object"];
NSLog(@"添加后的数组:%@", array1);
打印结果:
2017-03-20 11:39:19.627 OCdemo[916:70782] 原始数组:(
"first boject",
"second object",
"third object",
1
)
2017-03-20 11:39:19.627 OCdemo[916:70782] 添加后的数组:(
"first boject",
"second object",
"third object",
1,
"new object"
)
Program ended with exit code: 0
代码示例:
NSArray *array = @[@"first boject", @"second object", @"third object", @1];
NSArray *array1 = @[@"111", @2];
NSLog(@"原始数组:%@", array);
NSArray *arr = [array arrayByAddingObjectsFromArray:array1];
NSLog(@"添加后的数组:%@", arr);
2017-03-20 11:42:03.182 OCdemo[927:72308] 原始数组:(
"first boject",
"second object",
"third object",
1
)
2017-03-20 11:42:03.183 OCdemo[927:72308] 添加后的数组:(
"first boject",
"second object",
"third object",
1,
111,
2
)
Program ended with exit code: 0
从上面的代码中,也不难看出,在使用上面的两个给数组添加元素的方法时,都是将方法返回的数组赋值给了一个新的数组。
根据指定范围,返回一个子数组。
- (NSArray<ObjectType> *)subarrayWithRange:(NSRange)range;
代码示例:
NSArray *array = @[@"first boject", @"second object", @"third object", @1];
//获取字数组,从第0个元素开始,子数组长度为2
NSArray *childArray = [array subarrayWithRange:NSMakeRange(0, 2)];
NSLog(@"子数组:%@", childArray);
打印结果:
2017-03-20 11:45:49.860 OCdemo[940:74155] 子数组:(
"first boject",
"second object"
)
Program ended with exit code: 0
根据值判断数组中是否包含这个元素。
- (BOOL)containsObject:(ObjectType)anObject;
代码示例:NSArray *array = @[@"first boject", @"second object", @"third object", @1];
//判断数组中是否含有某个对象
BOOL isHave = [array containsObject:@"object"];
if (isHave) {
NSLog(@"包含");
}else{
NSLog(@"不包含");
}
打印结果:2017-03-20 11:48:18.087 OCdemo[950:75360] 不包含
Program ended with exit code: 0
3、遍历数组
(1)、使用索引,进行for循环遍历
代码示例:
NSArray *array = @[@"first boject", @"second object", @"third object", @1];
//使用索引,遍历数组
for (int i = 0; i < array.count; i++) {
NSLog(@"数组中第%d个元素:%@", i, array[i]);
}
打印结果:2017-03-20 11:51:48.603 OCdemo[973:77354] 数组中第0个元素:first boject
2017-03-20 11:51:48.604 OCdemo[973:77354] 数组中第1个元素:second object
2017-03-20 11:51:48.604 OCdemo[973:77354] 数组中第2个元素:third object
2017-03-20 11:51:48.604 OCdemo[973:77354] 数组中第3个元素:1
Program ended with exit code: 0
(2)、数组中元素类型相同时,可使用for-in循环遍历数组
代码示例:
NSArray *array = @[@"first boject", @"second object", @"third object", @"last object"];
//数组中元素都是字符串类型,可使用for-in循环遍历
for (NSString *string in array) {
NSLog(@"数组中的元素:%@", string);
}
打印结果:2017-03-20 11:54:25.423 OCdemo[986:78535] 数组中的元素:first boject
2017-03-20 11:54:25.424 OCdemo[986:78535] 数组中的元素:second object
2017-03-20 11:54:25.424 OCdemo[986:78535] 数组中的元素:third object
2017-03-20 11:54:25.424 OCdemo[986:78535] 数组中的元素:last object
Program ended with exit code: 0
(3)、枚举遍历
代码示例:
NSArray *array = @[@"first boject", @"second object", @"third object", @"last object"];
NSEnumerator* enumerator = [array objectEnumerator];
id e = nil;
while (e = [enumerator nextObject])
{
NSLog(@"e = %@", e);
}
打印结果:2017-03-20 11:55:36.628 OCdemo[996:79302] e = first boject
2017-03-20 11:55:36.629 OCdemo[996:79302] e = second object
2017-03-20 11:55:36.629 OCdemo[996:79302] e = third object
2017-03-20 11:55:36.629 OCdemo[996:79302] e = last object
Program ended with exit code: 0
(4)、代码块遍历(block)
代码示例:
NSArray *array = @[@"first boject", @"second object", @"third object", @"last object"];
//代码块遍历数组方法,正向遍历
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"正遍历,第%lu个元素:%@", idx, obj);
}];
NSLog(@"-------------分割线-----------");
//代码块遍历数组方法,反向遍历 比上面的方法对了一个参数option:
//NSEnumerationConcurrent:表示正向
//NSEnumerationReverse:表示反向
/*
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
NSEnumerationConcurrent = (1UL << 0),
NSEnumerationReverse = (1UL << 1),
};
*/
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"反遍历:第%lu个元素:%@", idx, obj);
}];
打印结果:
2017-03-20 12:03:10.341 OCdemo[1029:84118] 正遍历,第0个元素:first boject
2017-03-20 12:03:10.342 OCdemo[1029:84118] 正遍历,第1个元素:second object
2017-03-20 12:03:10.342 OCdemo[1029:84118] 正遍历,第2个元素:third object
2017-03-20 12:03:10.343 OCdemo[1029:84118] 正遍历,第3个元素:last object
2017-03-20 12:03:10.343 OCdemo[1029:84118] -------------分割线-----------
2017-03-20 12:03:10.344 OCdemo[1029:84118] 反遍历:第3个元素:last object
2017-03-20 12:03:10.344 OCdemo[1029:84118] 反遍历:第2个元素:third object
2017-03-20 12:03:10.344 OCdemo[1029:84118] 反遍历:第1个元素:second object
2017-03-20 12:03:10.344 OCdemo[1029:84118] 反遍历:第0个元素:first boject
Program ended with exit code: 0