Objective-C边学边记-8:Foundation Kit快速教程之 数组、枚举

4.集合

集合类:NSArray 、NSDictionary

1)NSArray

NSArray是Cocoa的一个类,用来存储对象的有序列表,可以在NSArray中放入任意类型的对象。

NSArray中只能存储Objective-C的对象,而不能存储C语言中的基本数据类型,如int,float,enum,struct,或者NSArray中的随机指针。同时,也不能在NSArray中存储nil(对象的零值或NULL值)。

1 #import <Foundation/Foundation.h>

2

3

4

5 int main (int argc, const char * argv[]) {

6 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

7

8 // 创建数组 arrayWithObjects:

9 NSArray *array;

10 array = [NSArray arrayWithObjects:

11 @"one", @"two", @"three", nil]; //列表结尾添加nil表示列表结束

12

13 // 获取对象个数 count:

14 NSLog(@" the count of array is: %d",

15 [array count]);

16

17 // 获取特定索引处的对象 objectAtIndex:

18 int i;

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

20 {

21 NSLog(@"index %d has %@",

22 i,[array objectAtIndex:i]);

23 }

24

25 // 将字符串切分成数组 componentsSeparatedByString:

26 NSString *str = @"oop : ack : elf : com : cn : net";

27 NSArray *arr = [str componentsSeparatedByString:@" : "];

28 NSLog(@"str is : %@",str);

29 NSLog(@"arr is :");

30 for (NSString *s in arr)

31 {

32 NSLog(@"\"%@\"",s);

33 }

34 // 合并数组并创建字符串 componentsJoinedByString:

35 NSLog(@"合并数组到NSArray.");

36 str = [arr componentsJoinedByString:@" , "];

37 NSLog(@"str is : %@",str);

38 NSLog(@"arr is :");

39 for (NSString *s in arr)

40 {

41 NSLog(@"\"%@\"",s);

42 }

43

44

45 [pool drain];

46 return 0;

47 }

48

49

50

2)可变数组:

与NSString一样,一旦创建NSArray它就固定下来了,不能添加或删除其中的任何元素。当然,包含在数组中的对象是可以改变的,当数组对象本身一直都不会改变。

可变数组可以使用NSMutableArray

Example:

1 //

2 // MyClass.h

3 // FoundationKit4

4 //

5 // Created by Elf Sundae on 10/22/10.

6 // Copyright 2010 Control-Strength. All rights reserved.

7 //

8

9 #import <Cocoa/Cocoa.h>

10

11

12 @interface MyClass : NSObject

13 {

14 NSString *firstName;

15 NSString *lastName;

16 }

17

18

19 - (void) setFirstName:(NSString *)m_firstName;

20 - (NSString *) firstName;

21

22 - (void) setLastName: (NSString *) m_lastName;

23 - (NSString *) lastName;

24

25 - (NSString *) fullName;

26

27 @end

1 //

2 // MyClass.m

3 // FoundationKit4

4 //

5 // Created by Elf Sundae on 10/22/10.

6 // Copyright 2010 Control-Strength. All rights reserved.

7 //

8

9 #import "MyClass.h"

10

11

12 @implementation MyClass

13

14 - (void) setFirstName:(NSString *)m_firstName{

15

16 firstName = m_firstName;

17 }

18 - (NSString *) firstName{

19 return firstName;

20 }

21

22 - (void) setLastName: (NSString *) m_lastName{

23 lastName = m_lastName;

24 }

25 - (NSString *) lastName{

26 return lastName;

27 }

28

29

30 - (NSString *) fullName

31 {

32 if (firstName == nil || lastName == nil) {

33 return @"No Name found.";

34 } else {

35 return [NSString stringWithFormat:@"%@ %@",

36 firstName,lastName];

37 }

38

39 }

40 @end

1 //

2 // FoundationKit4.m

3 //

4

5 #import <Foundation/Foundation.h>

6 #import "MyClass.h"

7

8 int main (int argc, const char * argv[]) {

9 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

10

11 // 创建可变数组

12 NSMutableArray *array;

13 array = [NSMutableArray arrayWithCapacity: 20];

14 // 添加对象: addObject

15 int i;

16 for (i = 0; i < 4; i++)

17 {

18 MyClass *myClass = [MyClass new];

19 [array addObject:myClass];

20 }

21 [[array objectAtIndex:0] setFirstName:@"Elf"];

22 [[array objectAtIndex:0] setLastName:@"Sundae"];

23

24 [[array objectAtIndex:3] setFirstName:@"Joe"];

25 [[array objectAtIndex:3] setLastName:@"Gates"];

26

27

28 for (MyClass *my in array)

29 {

30 NSLog(@"%@",[my fullName]);

31 }

32

33 // 删除对象:removeObjectAtIndex:

34 NSLog(@"删除第二个对象后:");

35 [array removeObjectAtIndex:1];

36

37 for (MyClass *my in array)

38 {

39 NSLog(@"%@",[my fullName]);

40 }

41

42 [pool drain];

43 return 0;

44 }

45

46

3)枚举 (NSEnumerator)

遍历数组每个索引处的对象,你可以编写一个0到[array count]的循环,而NSEnumerator用来描述这种集合迭代运算的方式。

通过objectEnumerator向数组请求枚举器,如果想从后向前浏览集合,可使用reverseObjectEnumerator方法。在获得枚举器后,可以开始一个while循环,每次循环都向这个枚举器请求它的下一个对象:nextObject。nextObject返回nil值时,循环结束。示例如下:

1 // NSEnumerator示例

2 NSEnumerator *enumerator;

3 enumerator = [array objectEnumerator];

4 id thing;

5 while (thing = [enumerator nextObject]) {

6 NSLog(@"I found %@",thing);

7 }

对于可变数组进行枚举操作时,主要不要添加或删除数组中的对象。

4)快速枚举

Objective-C2.0支持快速枚举:如

1 for (NSString *string in array)

2 {

3 NSLog(@" I found %@",string);

4 }

5

6

这个循环将会遍历数组中的每个元素,并且用变量string存储每个数组值。它比枚举器语法更加简洁快捷。