集合(二)——集合家族

一.集合家族

1.NSArray

NSArray是一个Cocoa类,用来存储对象的有序列表,

限制:a.只能存储Objective-C的对象,而不能存储C语言中的基本数据类型,如int,float,enum,struct或者NSArray中的随机指针。

b.不能在NSArray中存储nil(对象的零值或NULL值)。

         //通过类方法arrayWithObjects创建一个新的NSArray,发送一个以逗号分隔的对象列表,
	//在列表结尾添加nil代表列表结束(这就是不能在数组中存储nil的原因之一)
	NSArray *array;
	array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
	//获得对象的个数
	- (unsigned) count;
	//获取特定索引处的对象
	- (id)objectAtIndex: (unsigned int) index;
 

2.NSMutableArray:可变数组

       //数组容易也只是数组最终大小的一个参考,不会将对象预写入数组,也不会用该容量值来限制数组的大小。
	+ (id) arrayWithCapactity: (unsigned int) numItems;
	//在数组结尾处添加对象
	- (void) addObject: (id) anObject
	//删除特定索引处的对象
	- (void)removeObjectAtIndex:(unsigned) index;
 

3.NSEnumerator(枚举)

       //创建
	- (NSEnumerator *) objectNSEnumeratort;
	NSEnumerator *anumerator;
	enumerator = [array objectNSEnumerator];
	//从后向前浏览集合
	- (void)reverseObjectEnumerator;
	//获得枚举器之后可以开始一个while循环,每次循环都向这个枚举器请求它的下一个对象;
	- (id) nextObject;
	nextObject返回nil值时,循环结束
	整个循环代码:
	NSenumerator *enumerator;
	enumerator = [array objectEnumerator];
	
	id thingie;
	//对可变数组进行枚举操作时,不能对数组容器进行添加或删除操作
	while(thingie == [enumerator nextObject]){
		NSLog(@"I found %@",thingie);	
	}
 

4.快速枚举

for(NSString *string in array){
		NSLog(@"I found %@",string);
	}
 

5.NSDictionary(散列结构)

(1)NSDictionary

                //创建字典
		+ (id)dicationaryWithObjectsAndKeys:
					(id)firstObject,...;
		//获取字典中的值
		- (id) objectForKey: (id) aKey;

		示例代码:
		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]

		Tire *tire =[tires objectForKey: @"back-right"];
 

(2)NSDictionary不可变,NSMutableDictionary允许随意添加或删除元素。

                //创建NSMutableDictionary可以发送dictionary消息,也可以用dictionaryWithCapacity:方法
		//并用告诉该字典的最终大小
		+ (id) dicationaryWithCapacity: (unsigned int) numItems;//大小仅仅是建议,不是对其限制
		//添加元素
		- (void) setObject: (id) anObject 
				forKey: (id) aKey;
		//删除元素
		- (void) removeObjectForKey:(id)aKey;
 

基本数据类型包装类

1.NSNumber

NSArray和NSDictionary只能存储对象,而不能直接存储任何基本类型的数据,但是可以用对象来封装然后添加到集合中

Cocoa提供了NSNumber类来包装(即以对象形式实现)基本数据类型

a.几个方法示例:

        + (NSNumber *) numberWithChar : (Char)value;
	+ (NSNumber *) numberWithInt : (Int)value;
	+ (NSNumber *) numberWithFloat : (Float)value;
	+ (NSNumber *) numberWithBool: (Bool)value;
 

b。Objective-c中不支持自动装箱

        NSNumber *number;
	number = [NSNumber numberWithInd:42];
	[array addObject: number];
	[dictionary setObject: number forkey: @"Bork"];
 

C。只要将一个基本类型数据封装到NSNumber中就可以通过下列方法重新获取它

        - (Char) charValue;
	-  (Int) intValue;
	- (Float) floatValue;
	- (Bool) boolValue;
	- (NSString *) stringValue
 

2.NSValue

NSNumber是NSValue的子类,NSValue可以包装任意值。

+ (NSValue *) valueWithBytes: (const void *) value
			objCType: (const void *) type;

可以使用类方法创建新的NSValue:

 

3.NSNull

不能将nil存入近NSArray,NSDictionary中,因为nil代表的是一个集合的结束。

传空值用如下方法:

 + (NSNull *)  null;

示例:

[contact setObject: [NSNull null] forKey:@"home fax machine"];

访问它的方法

        id homefax;
	homefax = [contact objectForKey: @"home fax machine"];
	if(homefax == [NSNull null]){
		//no fax machine......
	}
 

二.集合综合运用小例子查找文件

int main(int argc, Const char *argc[]){
	//初始化对象池
	NSAutoreleasePool *pool;
	pool = [[NSAutoreleasePool alloc] init];
	//获得fileManager
	NSFileManager *defaultManager;
	defaultManager = [NSFileManager defaultManager];
	//将路径封装
	NSString *home;
	home = [@"~",stringByExpandingTildeInPath];
	//将路径字符串传递给文件管理器
	NSDirectoryEnumerator *direnum;
	direnum = [manager enumeratorAtPath: home];
	//创建可变数组
	NSMutableArray *files;
	files = [NSMutableArray arrayWithCapacity: 42];
	//迭代符合条件扩展名为jpg的文件名
	NSString *filename;
	while(filename = [direnum nextObject]){
		if([[filename pathExtension] isEqualTo: @".jpg"]){
			[files addObject: fillname];
		}
	}
	//打印所有符合条件的文件名
	NSEumerator *filenum;
	filenum = [files objectEnumerator];
	while(filename = [filenum nextObject]){
		NSLog(@"%@",filename);
	}

	[pool drain];
	return 0;
}
 

  快速迭代方法

int main(int argc, Const char *argc[]){
	NSAutoreleasePool *pool;
	pool = [[NSAutoreleasePool alloc] init];

	NSFileManager *defaultManager;
	defaultManager = [NSFileManager defaultManager];

	NSString *home;
	home=[@"~",stringExpandingTildeInPath];

	NSMutableArray *files;
	files = [NSMutableArray arrayWithCapacity: 42];

	for(NSString *filename in [defaultManager enumeratorAtPath: home]){
		if([[filename pathExtension] isEqualTo: @".jpg"]){
			[files addObject filename];
		}
	}

	for(NSString *filename in files){
		NSLog(@"@",filename);
	}
}
 
资源下载链接为: https://pan.quark.cn/s/502b0f9d0e26 在进行STM32F103C8T6与HC - 06蓝牙模块、PC端以及ROS(机器人操作系统)的串口通信测试时,我们编写了以下程序。 硬件连接 将STM32F103C8T6的USART1的TX(PA9)引脚与HC - 06的RX引脚相连,同时将USART1的RX(PA10)引脚与HC - 06的TX引脚相连,以实现两者之间的串口通信。 另外,通过串口转USB模块(如CH340等)将STM32F103C8T6与PC端连接起来,方便在PC端进行通信数据的发送和接收。 程序功能 初始化USART1,设置波特率为9600,用于与HC - 06通信。同时,初始化USART2(连接串口转USB模块),波特率同样设置为9600,用于与PC端通信。 在主循环中,STM32F103C8T6不断检测USART1和USART2是否有数据接收。当从USART1(HC - 06)接收到数据时,将数据暂存到一个缓冲区中,然后通过USART2发送给PC端。反之,当从USART2(PC端)接收到数据时,也暂存到缓冲区,再通过USART1发送给HC - 06。这样就实现了STM32F103C8T6作为中间节点,将HC - 06与PC端的数据进行转发。 硬件连接 HC - 06蓝牙模块通过串口与STM32F103C8T6连接,如上所述。 程序功能(蓝牙通信部分) HC - 06在默认状态下会自动进入配对模式,等待与手机或其他蓝牙设备配对。当配对成功后,它会将从蓝牙设备接收到的数据通过串口发送给STM32F103C8T6。同时,它也会将STM32F103C8T6发送过来的数据转发给已配对的蓝牙设备。在本测试程序中,主要关注其与STM32F103C8T6之间的串口通信功能,确保数据能够正确地在两者之间传输。 硬件连接 通过串口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值