简介
OC语言的集合不再是单纯的数组,而是分为3大类:数组NSArray,字典NSDictionary,集NSSet;平常使用的集合都是这3类,或者他们的子类;
OC语言的所有集合都是对象,集合中的元素也都是对象,集合中也只能存放对象;
简单及复杂数据类型(int、double、CGPoint、CGRect)可以封装为NSValue、NSNumber对象再放入集合类中;
集合中不能存放nil空对象,nil是作为集合结束标识符;
OC集合没有多维的概念,也就是不会出现根本意义上的二维数组,我们可以简单的这样理解:在数组中存放了一个对象,这个对象是数组;
集合的所有运算依赖于方法,但是多数情况下依旧要使用循环;
数组
简介
OC中的集合类只能收集cocoa对象(NSObject对象),C数据类型(例如:int、float、double、BOOL等),需要封装成NSNumber类型的,才可以保存在集合类中。(NSNumber对象是cocoa对象)。
OC中的数组同C语言中的数组非常接近,常见的用法首先是创建数组,然后对数组进行操作。
OC中数组分为不可变数组(NSArray)和可变数组(NSMutableArray) ,且只能存储Object-C对象。
NSArray在初始化的同时一般需要指定它所包含的元素,以nil作为结束标志,初始化中不能包含空对象。
NSArray是不可变数组,数组存放的对象个数和每个对象都不可改。
NSArray
重要方法
删除元素:
subarrayWithRange:
方法截取掉数组中的某一段,然后返回一个新数组,其用法与NSString类型的截取基本一致。数组排序:
sortedArrayUsingSelector:
方法通过指定的compare:
方法进行排序,这里直接使用了NSString类型的compare:
方法,为默认的排序方法,也可以使用自定义方法,@selector(自定义方法名)。对数字数组排序时,需要将数字加入数组,首先要转换成NSNumber。然后再使用
sortedArrayUsingSelector:
,在取出数字元素时也要转换类型。对对象数组排序,使用NSSortDescriptor。
NSMutableArray
可变数组NSMutableArray,继承自NSArray,拥有父类的全部特性;
常用方法
Tips:
NSMutableArray的方法,直接对数组自身进行操作,没有返回值。
数组遍历
- for 循环遍历
for (int i = 0; i < [array count]; i++) {
// 依次取出数组每个元素
id obj = [array objectAtIndex:i];
}
- 快速枚举遍历
// 使用一个迭代变量逐个替代数组中的每个对象,然后直接使用这个对象进行运算
for (id obj in array) {
// obj do something
}
Tips:
如果遍历的数组是可变类型,一定不要在循环体中进行添加或移除操作,一般先记录对象,循环结束后再整体添加或删除。
数组简化
Xcode4.5版本以后的简化操作:
1、[NSArray array] 简写为 @[]
NSArray *array = @[];
2、[NSArray arrayWithObject:a] 简写为 @[ a ]
NSArray *array = @[@"Hello"];
3、[NSArray arrayWithObjects:a,b,c] 简写为 @[ a,b,c ]
NSArray *array = @[@"a", @"b", @"c"];
Tips
1、简化适合不可变数组,不推荐可变数组使用。想得到可变版本的话,可以对其发送 -mutableCopy 消息以生成一份可变的拷贝。
示例:
NSMutableArray *numbers = [@[@1, @2, @3, @4, @5] mutableCopy];
2、对于标记为static的数组,不能使用简写为其赋值。
字典
简介
字典就是关键字及其定义(描述)的集合。Cocoa中的实现字典的集合NSDictionary在给定的关键字(通常是一个NSString)下存储一个数值(可以是任何类型的对象)。即:存储方式为通过 键-值 对的方式来存放数据的一种无序集合。
字典也被称为散列表或关联数组。
不同于数组,字典使用的是键查询的优化存储方式。它可以立即找出要查询的数据,而不需要遍历整个数组进行查找。
一般通过key来操作object。某种意义上,对字典的运算实际上就是对key值的运算。
字典分为不可变字典NSDictionary和可变字典NSMutableDictionary。
NSDictionary
常用方法
Tips
1、键不可以重复,值可以
2、当设置的key值与原有key值重复时,会直接覆盖原来的键值对,这也是更改字典数据的方法。
NSMutableDictionary
常用方法
Tips
1、
setObject:forKey:
方法,如果在字典中无法找到该key,则做添加处理
字典简化
Xcode4.5版本以后的简化操作
1、[NSDictionary dictionary] 简写为@{}
NSDictionary *dictionary = @{};
2、[NSDictionary dictionaryWithObject:forKey:] 简写为:@{key:value}
NSDictionary *dictionary = @{@"name": @"Admin”};
3、[NSDictionary dictionaryWithObjectsAndKeys:ob1,key1,ob2,key2} 简写为:@{key1:ob1 , key2:ob2};
NSDictionary *dictionary = @{@"one": @"rice",@"two":@"sleep"};
Tips
1、简化适合不可变字典,不推荐可变字典使用。
集
简介
NSSet对象中不能存放重复对象,如果出现重复,最终只会保留一个,NSSet也常用来清除其他集合中的重复对象。
集,类似数组,但区别于数组,其特点是:无序不重复;
集分为可变集 NSSet 与不可变集 NSMutableSet;
NSSet
- 初始化
// 1、alloc + init
- (instancetype)initWithObjects:(ObjectType)firstObj, ... ;
// 2、遍历构造
+ (instancetype)setWithObjects:(ObjectType)firstObj, ...;
- 常用方法与属性
1、获取元素个数
- (NSUInteger)count;
2、获取任意元素
- (nullable ObjectType)anyObject;
3、获取所有元素
@property (readonly, copy) NSArray<ObjectType> *allObjects;
4、查询是否包含某一元素
- (BOOL)containsObject:(ObjectType)anObject;
NSMutableSet
- 常用方法
// 1、添加元素
- (void)addObject:(ObjectType)object;
// 2、删除元素
- (void)removeObject:(ObjectType)object;