一、枚举器:NSEnumerator
定义:
①、能一一列举容器类中存储的元素
②、枚举类不需要自己去创建对象
数组中运用枚举器
①、定义一个数组
NSMutableArray *mArray = [@[object1,object2,……objectN] mutableCopy];
②、获取数组的枚举器
NSEnumerator *arrEnum = [mArrayobjectEnumerator];
③、用nextObject一一获取枚举器中的元素,当元素结束时,nextObject返回nil,nextObject方法每调用一次,或获取一个对象,并且下移
while(id object = [arrEnumnextObject]){
}
※注意:在枚举过程中,不能改变被枚举对象
④、获取数组的方向枚举器:[arrEnumreverseObjectEnum]
数组的快速枚举:for(object in collection){ 循环体;}
定义:for in 是对枚举进行封装后的结果
①、collection :被枚举对象 ----->容器类对象
②、object : 接收元素的变量
字典中运用枚举器
①、创建字典
NSMutableDictionary *mDict =[@{value1 : key1,value2:key2,……valueN : keyN} mutableCopy];
②、获取字典中的key的枚举器
NSMutableDictionary *dictEnum = [mDict keyEnumerator];
③、用nextObject获取key值
while(id key = [dictEnum nextObject]){
④、通过key获取对应的value
id object = mDict[key];
}
※注意:不能改变被枚举对象的值
字典的快速枚举
①、字典的快速枚举只是枚举key值,通过它的key获取到它的value
for(object in mDict){
id value = mDict[key];
}
※注意:不能改变被枚举对象的值
集合中的枚举
①、创建集合
ESMutableSet *Set = [[NSMutableSet alloc] initWithObjects: object1, object2, ……objectN ,nil];
②、获取集合中的枚举器
NSEnumerator *setEnum = [Set objectEnumerator];
③、通过nextObject获取集合的元素
while (id object = [setEnum nextObject]){
}
快速枚举
for(id object in set){
}
二、排序
可变数组排序方法
[mArray sortUsingSelector: @selector(方法)]
@selector 方法选择器
三、排序描述类:NSSortDescriptor
①、创建一个可变数组
NSMutableArray *mArray = [@[object1, object2, ……,objectN] mutableCopy];
②、创建描述类
NSSortDescriptor *sortDesc = [[NSSortDescriptor alloc]initWithKey: 属性名称 ascending: (YES\NO)];
key: 排序主键 --> 对象属性名称
ascending: 是否是升序
③、按照排序描述进行排序
[mArray sortUsingDescriptors:@[sortDesc1,sortDesc2,……sortDescN];
※注意:
1、参数是数组,数组中必须是排序描述类对象
2、如果参数有多个排序描述时,首先按第一个描述排序,遇到相同属性,则按第二个进行排序,以此类推,可以多个排序描述
四、block
1、定义block变量格式:
返回值(^block)(参数列表);
※注意:
①、它的代码块可以在函数内部定义
②、block在定义时没有返回值类型
③、block在函数体内定义时,不会被马上被执行
④、注意在右大括号后面记得加分号
2、有参有返回值
int (^block)(int a,int b) = ^(int a,int b){
return: a+b;
};
3、无参无返回值
void (^blockVoid)() = ^(){
};
4、有参无返回值
void(^block)(int a,int b) = ^(int a,int b){
};
5、无参有返回值
int(^block)() = ^(inta,int b){
};
6、给block类型命别称
typedef BOOL (^comBlock)(int a,int b);
※注意:comBlock就是BOOL (^)(int a,int b)block类型的别称
定义时可以直接:
comBlock cc = ^(int a,int b){
}
7、block和局部变量
①、在block体中不可以修改局部变量的值,但在block体中可以访问局部变量的值
②、利用双下划线"__block"修饰过的变量,可以在block体中被修改,访问时的值是block被调用时的值
例子:
__block int number = 10;
comBlock cb = ^(int a,int b){
number++;
NSLog(@"blockNumber = %d",number);
return YES;
};
NSLog(@"Number = %d",number);
number = 100;
number = 10000;
cb(5,2);
NSLog(@"Number1 = %d",number);
8、有关block的使用方法
arrayTwo = [arrayTwo sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
Student *s1 = obj1;
Student *s2 = obj2;
if ([s1.name compare:s2.name] > 0) {
return 1;
}
else if ([s1.name compare:s2.name] < 0){
return -1;
}
return 0;
}];
NSLog(@"按照姓名排序后的结果:%@",arrayTwo);
注意:arrayTwo 是一个学生类的数组