OC--NSArray数组


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













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值