码迷,mamicode.com
首页 > Web开发 > 详细

关于objective-c数组,这些方法你得知道

时间:2016-06-15 23:38:24      阅读:1435      评论:0      收藏:0      [点我收藏+]

标签:

1c数组

因为objective-c语言是在c语言的基础上建立的,在obj中使用c数组是完全没问题的。

定义:

int a[10]; // 定义了10个元素的整形数组

float b[10]; // 定义了10个元素的浮点型数组

注意:

以下定义是正确的:

#define NUM 5

int a[3+NUM];

int b[2+1];

以下定义是错误的:(不能使用变量表示元素个数)

int n = 5;

int a[n];

c数组本质上就是指针。

obj中,数组有两种方法:NSArrayNSMutableArray

2NSArray

这是一个不可变数组,不可变指的是

内容不可变(无法修改元素)

长度不可变(无法插入,删除元素)

定义:

使用实例方法创建数组对象:

// 注意最后一个元素是nil

NSArray *array1 = [[NSArray alloc]initWithObjects:

@"one",@"two",[NSNumbernumberWithInt:3], @"four", nil];

// 没有尾巴nil

NSArray *array2 = [[NSArray alloc]initWithObjects:

array1];

使用类方法创建数组对象:

// 需要带着尾巴nil

NSArray *array4 = [NSArray arrayWithObjects:

@"one", @"two", @"three", nil];

使用c数组创建数组对象:

其中arrayWithObjects后要带c类型的数组对象

NSString *strings[3];

strings[0] = @"First";

strings[1] = @"Second";

strings[2] = @"Third";

// arrayWithObjects后需要一个c类型的数组对象

NSArray *array = [NSArray arrayWithObjects:

strings count:2];

// strings array contains { @"First", @"Second" }

直接快速创建数组对象【推荐方法】:

// 不需要尾巴nil,这种方法也是最推荐的写法

NSArray *array5 = @[@"one", @"two", @"three", @"four"];

《编写高质量iosOS X代码的52个有效方法》提及【语法糖】:多用字面量语法,少用与之等价的方法。

所以创建数组用:

NSArray *array = @[@"one", @"two", @"three"];

这样的好处显而易见:简明扼要,好理解,而且不用专门添加尾巴的空对象nil

这里截取该书中的一段代码:

id object1 = ...;

id object2 = ...;

id object3 = ...;

// arrayWithObject方法创建数组

NSArray *array1 = [NSArray arrayWithObjects:

object1, object2, object3, nil];

NSArray *array2 = @[object1, object2, object3];

假设object2 = nil;

对于第一种创建方法:array1会依次处理各个参数,直到发现nil为止。

由于object2nilarray1会提前结束,即只包含变量object1,但是程序编译时并不会提示,然后在运行时,就会抛出异常。

而第二种创建方法:array2直接抛出异常。

所以:使用字面量语法(语法糖)更为安全。

下面介绍其他方法:

根据下标获取元素:

NSArray *array;

id object1 = [array objectAtIndex:0];

id object2 = array[0];

同理:建议采用字面量语法,使用第二种取值方法,通过下标来取值。

获取第一个和最后一个元素:

NSString *first=[array firstObject];

NSString *last=[array lastObject];

根据元素获取下标:

NSInteger index=[array indexOfObject:

@"three"]; // 结果为:2

判断数组中是否存在某个元素:(containObject)

if (array containObject:@"three")

{

    NSLog(@"contains");

}

获取数组某个范围的数据:(subarrayWithRange)

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

// 第一个参数是位置,第二个是个数

NSRang range =NSMakeRange(1, 2);

NSArray *array2 =

[array1 subarrayWithRange:range];

遍历:

// 第一种方法

1for (int i = 0; i < array.count; i++)

// 第二种方法

2NSEnumerator *enumerator =

[array objectEnumerator];

id ob;

while (ob = [enumerator nextObject])

{

}

// 第三种方法

3for (id a in array)

应注意在NSArray遍历的过程中,无法修改array的数据

还有其他方法,比如componentsJoinedByString等等。

3NSMutableArray

这是一个可变数组:

父类是NSArray(所以NSArray拥有的属性NSMutableArray也有)

可以对元素进行修改:增加,删除,修改

定义:

使用initWithObject

NSMutableArray *array = [NSMutableArray alloc]

initWithObjects:@1,@2,nil]; // NSArray的用法

使用initWithCapacity

NSMutableArray *array = [NSMutableArray alloc]

initWithCapacity:0]; // 后面的数字是元素的个数

如果你知道需要多少容量,那么就使用initWithCapacity:n来设置

这样的好处是:添加元素时,不需要重新分配内容。

你也什么都不做可以直接初始化

NSMutableArray *array = [NSMutableArray alloc] init];

array = [@[@1, @2, @3,] mutableCopy];

// 通过语法糖进行初始化

// 需要加mutableCopy方法

同上,这也是推荐的初始化做法:使用语法糖初始化

使用字面量语法创建出来的字符串,数组,字典对象都是不可变的

所以要想可变版本,需要复制一份,因此使用mutableCopy方法

这么做的代价是多调用一个方法,还要再创建一个对象

但是字面量语法带来的好处却远远大于上述的缺点

下面介绍其他方法

增加元素:

[array addObject:object1];

插入元素:

[array insertObject:object1 atIndex:0]:

// 在某个位置插入元素

删除:

// 看名字就知道怎么回事了

[array removeObject:object1];

// 删除最后一个元素

[array removeLastObject];

// 删除范围之内的元素

[array removeObject:object1

inRange:NSMakeRange(0, 2)];

// 删除所有元素

[array removeAllObjects];

替换和交换:

// 替换某个位置的元素

[array replaceObjectAtIndex:0

withObject:object1];

// 交换位置

[array exchangeObjectAtIndex:0

withObjectAtIndex:2];

两个数组的用法大致如上。

如何创建一个有5个元素的float数组?

利用NSNumber

// NSNumber:是一个用来装基础类型的对象,

可以把整形,单精度,双精度,字符型等基础类型存储为对象

NSNumber *intNum = [[NSNumber alloc]

initWithInt:1];

NSNumber *floatNum = [[NSNumber alloc]

initWithInt:1.1f];

NSNumber *doubleNum = [[NSNumber alloc]

initWithInt:2.2f];

NSNumber *charNum = [[NSNumber alloc]

initWithInt:’A’];

// 使用NSNumber存储基础类型

NSNumber *float1 = [[NSNumber alloc]

initWithFloat:1.1f];

NSNumber *float2 = [[NSNumber alloc]

initWithFloat:2.2f];

NSNumber *float3 = [[NSNumber alloc]

initWithFloat:3.3f];

NSNumber *float4 = [[NSNumber alloc]

initWithFloat:4.4f];

NSNumber *float5 = [[NSNumber alloc]

initWithFloat:5.5f];

// 使用语法糖初始化

NSArray array = [@[float1, float2, float3,

float4, float5]];

// 使用时

NSLog(@"%d", [intNum intValue]);

NSLog(@"%f", [array[0] floatValue]);

使用c数组来初始化:

float a[5];

for (int i = 0; i < 5; i++)

{

    a = i;

}

原文来自:菠萝心

关于objective-c数组,这些方法你得知道

标签:

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
jiangjie190
加入时间:2016-02-19
  关注此人  发短消息
文章分类
jiangjie190”关注的人------(0
jiangjie190”的粉丝们------(1
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!