Objective-C 日记④ 集合家族
一、NSArray
NSArray是Cocoa的一个类,用来存储对象的有序列表。
限制:
1、只能存储Object-C的对象,不能存储C语言中的基本数据类型,如:int、float、enum、struct或者NSArray中的随机指针;
2、不可以存储nil(对象的零值或NULL值);至于为什么继续向下看
如何创建?
通过类arrayWithObjects创建NSArray,以逗号分隔对象列表,在列表尾部添加nil代表列表结束(这就是不能在数组中存储nil的第一个原因(第二个继续向下))
可以使用NSNull代表没有值 +(NSNull *) null;
NSArray *array; array=[NSArray arrayWithObjects:@"1",@"2",@"3",nill];
数组对象个数:-(unsigned) count;
根据索引获取对象:-(id)objectAtIndex:(unsigned int)index;
eg:
#import<Foundation/Foundation.h> int main(int argc,const char *argv) { NSArray *array; array=[NSArray arrayWithObjects:@"1",@"2",@"3",nil]; int i; for(i=0;i<[array count];i++) { NSLog(@"第 %d 是:%@",i,[array objectAtIndex:i]); } }
效果:
切分数组
使用-componentsSeparatedByString来切分NSArray
NSString *string=@"kaka:18:PEPE:20";
NSLog(@"没改变之前的我:%@",string);
NSArray *array=[string componentsSeparatedByString:@":"]; [kəm'pəunənt] adj. 组成的,构成的n. 成分;组件;元件 ['sepəreit, 'sepərit]vt. 使分离;使分开;使分居
使用componentsJoinedByString来合并NSArray中的元素并创建字符串
string=[array componentsJoinedByString:@"*"];
NSLog(@"改变之后的我:%@",string);
eg:
二、可变数组NSMutableArray
NSString有一个可变字符串NSMutableString同理数组NSArray也有一个可变数组NSMutableArray创建方式同NSMutableString 如下:
+(id)arrayWithCapacity:(unsigned)numitems
eg:
NSMutableArray *array2 ; array2=[NSMutableArray arrayWithCapacity:17]; NSArray *array3=[NSArray arrayWithObjects:@"one",@"two",@"three",nil]; [array2 addObject:array3]; int i; for( i=0;i<[array2 count];i++) { NSLog(@"第 %d 是:%@",i,[array2 objectAtIndex:i]); }
效果:
删除:-(void)removeObjectAtIndex:(unsigned)index;
三、枚举王国
NSEnumerator它是Cocoa用来描述集合迭代运算的方式,可以通过objectEnumerator向数组请求枚举器:
-(NSEnumerator *)objectEnumerator;
eg:
#import<Foundation/Foundation.h> int main(int argc,const char *argv) { NSArray *array; array=[NSArray arrayWithObjects:@"A",@"B",@"C",nil]; NSEnumerator *enumerator; enumerator=[array objectEnumerator]; id thing; //nextObject返回nil值时表示循环结束 while(thing=[enumerator nextObject]){ NSLog(@"I found %@",thing); } //reverseObjectEnumerator从后向前浏览集合 enumerator= [array reverseObjectEnumerator]; while(thing=[enumerator nextObject]){ NSLog(@"I found %@",thing); } }
效果:
注意:
1、xtObject返回nil时表示循环结束这也是数组NSArray不能有nil的第二个原因
2、不可以通过添加或者删除对象的方式来改变数组容器
四、快速枚举
书上说是这样子的:
NSString *string; for( string in array){ NSLog(@"I found %@",string); }
可是我是Nodepad++ vs GNU 可能如书上所说这是一个新特性,运行不了;适合在Leopard或更高级版本的系统上运行程序
总结:
介绍了三种方式遍历数组:索引、NSEnumerator、快速枚举
如果你的系统是高版本的操作系统或者是Leopard ['lepəd]n. 豹;美洲豹的那么选择第三种快速枚举.原因很简单就是快速简洁。
五、字典(又称:散列表、关联数组)
NSDictionary:在给定的关键字(通常是一个NSString字符串)下存储一个数值(可以是任何类型的的对象)。
字典和数组都可以存储数据,但是对于频繁的查询大型的数据集来说使用字典的效率更高因为字典是键查询的优化存储方式,可以立即查找出要查询的数据,而不需要循环整个数组进行查询数据
使用类方法dictionaryWithObjectsAndKeys来创建字典,以nil值作为终止符号
+(id)dictionaryWithObjectsAndKeys:(id)firstObject,……
作者:PEPE
出处:http://pepe.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述