OC之集合家族

来源:互联网 发布:齐鲁石化网络电视台 编辑:程序博客网 时间:2024/05/01 11:28

原文出处:http://blog.csdn.net/mobailwang/article/details/7454441


Cocoa提供了很多集合类,来提供我们使用,下面就对其中的对象的使用说明

NSArray

NSArray是一个Cocoa类,用来存储对象的有序列表,你可以在其中放入任意类型的对象:NSString或者是其他你想要存储的对象,但只能是存储Objective-C的对象,而不能存储C语言中的基本数据类型,如int、float、enum、struct,或者NSArray中的随机指针,同时也不能在NSArray中存储nil(对象的零值或者NULL值)。只要有了一个NSArray,就可以通过各种方式操作它,例如让某个对象的实例对象指向这个数组,将该数组当作参数进行传递,获取数据中所存对象的个数,根据索引来得到相应的对象,查找数组中的对象,遍历数组等等。

arrayWithObjects:创建一个新的NSArray,发送一个以逗号分隔的对象列表,可在列表结尾添加nil代表列表结束,这也是为什么数组不能存储nil的原因之一。

NSArray *array;

array = [NSArray arrayWithObjects:

@“one”, @“two”,@“three”,nil];

 

通过NSArray的count:方法可以得到数组的个数;

- (unsigned)count;

也可以如下所示获取特定索引处的对象:

(id) objectAtIndex: (unsigned int) index;

例:

int i;

for(int i=0; i < [array count]; i++){

    NSLog(@“index %d has %”, i, [array objectAtIndex: i]);

}

输出结果:略。

如果引用的索引计数大于数组里面对象个数,运行时就会输出错误。

 

 

可变数组

NSArray与NSString一样,创建的是一个不可变的。一旦你用了特定数量的对象创建了一个数组,那么它就固定下来了:既不能添加任何元素,也不能删除任何元素。当然,数组里面的对象是可以改变的,数组自身是不会改变的。

因此引起一个新的可变数组NSMutableArray,这样就可以随意的添加或者删除数组中的对象。

常用的方法如下:

arrayWithCapacity:来创建新的可变数组:

+ (id) arrayWithCapacity: (unsigned) numitems;

例:

NSMutableArray *array;

array = [NSMutableArray arrayWithCapacity: 17];

addObject:在数组末尾添加对象

- (void)addObject:(id)anObject;

removeObjectAtIndex:删除特定索引处的对象。

- (void) removeObjectAtIndex: (unsigned) index;

 

 枚举

如果要编写一个从0到[array count]的循环来读取每个索引处的对象,也可以使用NSEnumerator,它是Cocoa用来描述这种集合迭代运算的方式。要想使用NSEnumerator,需要通过objectEnumerator向数组请求枚举器:

- [NSEnumerator *]objectEnumerator;

你可以按如下方式使用这个方法:

[NSEnumerator *enumerator;

enumerator = [array objectEnumerator];

如果你想要从后向前浏览 ,还可以使用reverseObjectEnumerator

在获得枚举器之后,可以开始一个while循环,每次循环都向这个枚举器请求它的nextObject(下一个对象):

- (id) nextObject;

当nextObject返回nil值时,循环结束,这也是不能在数组中存储nil值的另一个原因:我们没有办法判断nil是存储在数组中的数值还是代表结束的标志。

整个循环如下:

NSEnumerator *enumerator;

enumerator = [array objectEnumerator];

 

id thingie;

while (thingie = [enumerator nextObject])

{

    NSLog(@“I found %@”,thingie);

}

 

备注及疑问:如果要使用枚举器,有一个问题,就是不能用增加或者删除这类的方法去操作这个可变数组,要不然的话,就会出现问题。这是一个问题,可以试试!

 

 快速枚举

for (NSString *string in array){

    NSLog(@“I found %@”,string);

}

 

这样,遍历数组就有三种方式了,通过索引、使用NSEnumerator和快速枚举。

 

NSDictionary

NSDictionary在给定的关键字下存储一个数值(可以是任何类型的对象)。然后可以用这个关键字来查找相应的数值。NSDictionary与NSArray和NSString一样是不可变的对象,但是NSMutableDictionary类允许你随意添加和删除字典元素。在创建新的NSDictionary时,就要提供该字典的全部对象和关键字。

dictionaryWithObjectsAndKeys:创建字典。

+ (id) dictionaryWithObjectsAndKeys:(id)firstObject,(NSString)firstKey,,,,;

Dictionary接受对象和关键字交替存储的系统,以nil值为终止符。

例:

Tire *t1 = [Tire new];

Tire *t2 = [Tire new];

Tire *t3 = [Tire new];

Tire *t4 = [Tire new];

 

NSDictionary *tires;

tires = [NSDictionary dictionaryWithObjectsAndKeys: t1,@”front-left”, t2, @”front-right”, t3, @”back-left”, t4, @”back-right”, nil];

 

objectForKey:来获取字典中的值,向方法传递之前用来存储该值的关键字。

- (id) objectForKey: (id) aKey;

所以,要从字典中找到其中的一个对象,可以这样写:

Tire *tire = [tires objectForKey: @” back-left”];

如果根据关键字查不到对象,那么objectForKey:会返回nil值。

 

要创建新的NUMutableDictionary对象,向类NSMutableDictionary发送dictionary消息。你也可以使用dictionaryWithCapacity:方法来创建新的可变字典并且告诉最终大小。

+ (id) dictionaryWithCapacity: (unsigned int) numitems;

setObject:forkey:方法给字典添加元素:

- (void) setObject: (id) anObject forKey: (id) aKey;

 

下面是另一种创建存储轮胎的字典的方法:

NSMutableDictionary *tires;

tires = [NSMutableDictionary dictionay];

 

[tires setObject: t1 forKey:@”front-left”];

注意:如果对字典中已有的关键字使用setObject:forKey:,那么这个方法将会用新值替换原有的数值。如果你想在可变字典删除一个关键字,可使用removeObjectForKey:方法:

- (void) removeObjectForKey:(id) aKey;

例:[tires removeObjectForKey:@”back-left”];


0 0
原创粉丝点击