Objective-C集合总结
Objective-C里面的集合主要包括:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary
首先,NSString,NSArray和NSDictionary都是不可变的,一经分配空间,长度是固定的。另外3个类是可变的,初始化后还可以动态增加空间,长度不固定。这几个类在初始化和相关操作上有一定的相似性,放在一起对比学习,能加深理解。数组和字典有一些特殊的地方需要注意,后面进行说明,先从初始化开始:
字符串-NSString
字面量创建:NSString *string = @"this is a string";
格式化创建:+ (id) stringWithFormat:(NSString *) format,...;
例如:NSString * str = [NSString stringWithFormat:@"Your age is %d,and your height is %d",26,140];
从前面的+号可以看出,这是一个类方法
1、比较大小
方法一:- (BOOL) isEqualToString:(NSString *) aString
用来比较接收方和作为参数传递过来的字符串,返回一个BOOL(YES或NO)来表示两个字符串的内容是否相同,例如:
NSString *thing1 = @"hello 5";
NSString *thing2 = [NSString:stringWithFormat:@"hello %d",];
if([thing1:isEqualToString:thing2])
{
NSLog(@"they are the same!");
}
thing1==thing2与[thing1 isEqualToString:thing2]的区别,==运算符只判断thing1和thing2的指针数值是否相同,即:他们是否是同一事物;后者用来判断两个字符串的内容是否相同
方法二:- (NSComparisonResult) compare: (NSString *) aString option: (NSStringCompareOptions) mask;
compare方法将接收对象和传递过来的字符串逐个进行比较,返回一个NSComparisonResult(枚举类型)来表示比较结果。NSComparisonResult的定义如下:
enum
{
NSOrderedAscending = -,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult
参数option是一个掩位码,可以通过位或来添加标记,常用的标记如下:
- NSCaseInsensitiveSearch:不区分大小写自负。
- NSLiteralSearch:进行完全比较,区分大小写字符。
- NSNumbericSearch:比较字符串的字符个数,而不是字符串值。如果没有这个选项,100会排在99的前面。
如果你相比较字符串,需要忽略大小写并按字符个数进行排序,那么应该这么做:
if([thing1 compare:thing2 option:NSCaseInsensitiveSearch | NSNumerbicSearch] == NSOrderedSame)
{
NSLog(@"They match!");
}
2、字符串包含
起始处包含(以aString开头):- (BOOL) hasPrefix: (NSString *) aString;
结尾处包含(以aString结尾):- (BOOL) hasSuffix: (NSString *) aString;
内部包含(内部含有aString):- (NSRange) rangeOfString: (NSString *) aString;
rangeOfString方法返回的是一个NSRange结构体,封装来字符串匹配的位置和能够匹配的字符个数,例如:
NSString *fileName = @"draft-chapter.pages";
NSRange range = [fileName rangeOfString:@"chapter"];
//返回的range.location为6,range.length为7
如果传递的参数在接收字符串中没有找到,那么range.location则等于NSNotFound。
可变字符串-NSMutableString
NSMutableString是NSString的子类,长度可变,类似于c#中的StringBuilder,声明如下:
+ (id) stringWithCapacity: (NSUInteger) capacity;
这里的capacity只是个建议值,实际字符串大小并不限于所提供的容量。
1、添加字符串:
- - (void) appendString: (NSString *) aString;
- - (void) appendFormat: (NSString *) format,...;
例如:
NSMutableString *string = [NSMutableString stringWithCapacity:];
[string appendString:@"Hello there "];
[string appendFormat:@"human %d!",];
//最后string的值为:"Hello there human 66!"
2、删除字符串
方法:- (void) deleteCharactersInRange:(NSRange) aRange;
NSMutableString *friends = [NSMutableString stringWithCapacity:];
[friends appendString:@"James BethLynn Jack Evan"];
NSRange jackRange = [friends rangeOfString:@"jack"];
jackRange.length++;
[friends deleteCharactersInRange:jackRange];
//最终结果:"James BethLynn Evan"
NSMutableString是NSString的子类,所以任何使用NSString的地方都可以用NSMutableString来代替,例如,我们可以添加格式化字符串:
NSMutableString *string = [NSMutableString stringWithFormat:@"jo%dy",2]; //string的值为"jo2y"
不可变数组-NSArray
NSArray是一个Cocoa类,它比C、C++数组强大的地方在于,NSArray可以保存任意类型的对象,比如字符串、自定义类型甚至其他数组或字典,但是请记住:NSArray只能保存对象,像int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。另外,NSArray是不可变数组,一旦创建它的长度就固定下来来,不能添加和删除任何元素,当然数组中包含的对象是可以改变的,只不过数组对象本身是一直都不会变的。
NSArray的创建:
- 1、NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",nil];
- 2、NSArray *array1 = [NSArray arrayWithArray:array];(以现用的数组创建数组)
- 3、NSArray *array2 = [NSArray arrayWithObjects:@"one",@"two",@"three",nil]; //对象列表必须以nil结尾
- 4、NSArray *array3 = @[@"one",@"two",@"three"]; //以字面量的方式创建时,不必在结尾处特意补上nil
相关方法:
- (NSUInteger) count; //获取数组中对象的个数
- (id) objectAtIndex:(NSUInteger)index; //获取指定索引处的对象
还可以通过字面量访问数组,例如:id *myObject = array[1];我们可以利用计数和取值来遍历数组中的对象:
//方式一
NSUInteger count = [array count];
for(NSUInteger i = ; i < count; i++)
{
NSLog(@"index %d has %@.", i, [array objectAiIndex:i]);
} //方式二
for(NSUInteger j = ; j < count; j++)
{
NSLog(@"index %d has %@", j, array[j]);
}
NSArray还有一种特别的创建方式,就是通过切分字符串,方法的声明如下:
- (NSArray) componentsSeparatedByString:(NSString *) separater;
例如:NSString *string = @"oop:ack:bork:greeble:ponies";
NSArray *chunks = [string componentsSeparatedByString:@":"];
还可以反过来用指定字符串来合并NSArray中的元素来创建字符串,例如:
string = [chunks componentsJoinedByString:@"+"]; //string的内容为:"oop+ack:bork+greeble+ponies"
可变数组-NSMutableArray
NSMutableArray的创建:+ (id) arrayWithCapacity:(NSUInteger) numItems;
与NSMutableString中的stringWithCapacity方法一样,这里的容量只是一个建议值,当超出容量时可变数组能够动态的扩展空间。
尾部添加对象:- (void) addObject:(id) anObject;
指定索引处插入对象: - (void) insertObject:(id) anObject atIndex:(NSUInteger) index; //后面的元素向后移
删除指定索引处的对象: - (void) removeObjectAtIndex:(NSUInteger) index;
删除全部对象:- (void) removeAllObjects;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:]; //创建
for(NSInteger i = ; i < ; i++) //在尾部添加四个对象
{
Tire *tire = [Tire new];
[array addObject:tire];
}
Tire *t = [Tire new];
[array insertObject:t atIndex:1]; //在第二个位置处添加一个对象
[array removeObjectAtIndex:]; //删除索引为1的对象,即:第二个对象
[array removeAllObjects];
不可变字典-NSDictionary
和c#中的字典一样,Objective-c中的NSDictionary能在给定关键字(通常是一个NSString字符串)下存储一个数值,然后可以通过这个关键词来查找相应的数据。相对于数组,字典采用的是键查询的优化方式,它可以立即找出要查找的数据,而不需要遍历整个数组,对于频繁的查询和大型数据集来说,使用字典比数组要快得多。
像NSString和NSArray一样,NSDictionary也是不可变的,在创建新的NSDictionary时,就要提供该字典所存储的全部对象和关键字。
基本操作:
1、创建方式一:通过字面量方式,使用类似@{key:value,...}的方法来定义
2、创建方式二:通过dictionaryWithObjectsAndKeys方法,该方法接受对象和关键字交替出现的序列,以nil值作为终止符号,定义如下:
+ (id) dictionaryWithObjectsAndKeys:(id) firstObject,...
3、获取字典中的数据方式一:使用objectForKey,接收一个关键字,通过该关键字来获取对应的数据,该方法定义如下:
- (id) objectForKey:(id) aKey;
4、获取字典中的数据方式二:dictionary[key];
示例代码如下:
Tire *tire1 = [Tire new];
Tire *tire2 = [Tire new];
Tire *tire3 = [Tire new];
Tire *tire4 = [Tire new];
NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:tire1,@"front-left",tire2,@"front-right",tire3,@"back-left",tire4,@"back-right",nil];
//字面量方式
NSDictionary *tires = @{@"front-left":tire1,@"front-right":tire2,@"back-left":tire3,@"back-right":tire4}; //获取方式一
Tire *tire = [tires objectForKey:@"front-left"];
//获取方式二
Tire *tire = tires[@"front-left"];
可变字典-NSMutableDictionary
可以通过向NSMutableDictionary类发送dictionary消息来创建新的NSMutableDictionary对象,也可以通过dictionaryWithCapacity:方法来创建带初始大小的可变字典对象,这个方法的定义如下:
+ (id) dictionaryWithCapacity:(NSUInteger) numItems;
与之前提到过的NSMutableString和NSMutableArray一样,在这里,字典的容量只是一个建议值,而不是对其大小的限制。
可以通过setObject:forKey:的方法来为字典添加元素,定义如下:
- (void) setObject:(id) andObject forKey:(id) aKey;
如果对字典中已有的关键字使用setObject:forKey:方法,那么这个方法将会用新值替换原有的数据。如果想删除一些关键字,可使用removeObjectForKey:方法,定义如下:
- (void) removeObjectForKey:(id) aKey;
示例代码如下:
//创建词典对象,初始化长度为10
NSMutableDictionary *tires = [NSMutableDictionary dictionaryWithCapacity:];
// NSMutableDictionary *tires = [NSMutableDictionary dictionary]; //动态添加元素
[tires setObject:tire1:forKey:@"front-left"];
[tires setObject:tire2:forKey:@"front-right"];
[tires setObject:tire3:forKey:@"back-left"];
[tires setObject:tire4:forKey:@"back-right"]; //删除元素
[tires removeObjectForKey:@"back-left"];
Objective-C集合总结的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- 刨根问底Objective-C Runtime
http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...
- Objective C笔记(第一天)
• OC语言概述 1.早在20世纪80年代早期,Bard Cox发明了Objective C, 是扩充的C,面向对象的编程语言. 2.NEXTSTEP简称NS a.1985年,Steve Jobs成⽴ ...
- 【资源集合】94个iOS开发资源推荐,帮你加速应用开发
资源总结类文章总是开发者们所喜欢的,网上已经有各种weekly.头条以及期刊类资源总结,今天这篇来自于开发者Viswateja Reddy的总结.原文对各个项目的介绍非常简单,为了更便于阅读,编辑在原 ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- iOS知识点集合--更改(2)
3.nsmutablearray *a 如果直接赋值 a = @[@"d",@""]; 这个时候a 是不可变的 字典也是如此 2.如果接口调用错误的话 打印re ...
- A Diversity-Promoting Objective Function for Neural Conversation Models论文阅读
本文来自李纪为博士的论文 A Diversity-Promoting Objective Function for Neural Conversation Models 1,概述 对于seq2seq模 ...
- iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象
1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...
- Objective C语言中nil、Nil、NULL、NSNull的区别
以下内容是基于搜集整理的网上资料,供参考. nil:指向Objective C语言中对象的空指针,其定义值为(id)0. Nil:指向Objective C语言中类(Class)的空指针,其定义值为( ...
- iOS开发核心语言Objective C —— 全部知识点总结
本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...
随机推荐
- Python标准模块--ContextManager
1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...
- shiro权限管理框架与springmvc整合
shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘ 但从易用性和学习成本上考虑,shiro更具优势,同时shiro支持和很多接口集成 用户及权限管理是众多 ...
- CRL快速开发框架系列教程十三(嵌套查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
- BridgePattern(桥接模式)
/** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...
- SuperMap-iServer-单点登录功能验证(CAS)
SuperMap-iServer-单点登录功能验证(CAS) 1.测试目的: 验证SuperMap-iServer使用CAS单点登录的功能是否正常. 2.测试环境: SuperMap-iServer8 ...
- 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞
使用Nginx 让IIS和Tomcat等多个站点一起飞 前言: 养成一个好习惯,解决一个什么问题之后就记下来,毕竟“好记性不如烂笔头”. 这样也能帮助更多的人 不是吗? 最近闲着没事儿瞎搞,自己在写一 ...