Block的数据类型
格式:
返回值类型: (^)(参数类型1参数名1, 参数类型2 参数名2, ...)
注: 1.没有参数,括号不能省略
2.参数名可以省略, 特殊情况下,为了方便使用, 不省略
block赋值(实现)
//格式:
// ^(数据类型1参数名, 数据类型2 参数名2, ...) {
// 执行代码
//}
注:
1. 参数名不能省略
2.如果block有返回值,需要使用return返回值
Block的运用
1.
使用typedef对block类型重命名
例:

2.block内部访问变量
//block内部不能修改局部变量, 可以修改全局变量
//在block内部修改局部变量,需要在局部变量前加__block
3.block作为方法的参数(block排序)
例: 对一个数组内的字符串(数字)进行排序
//字符串是数字时的排序
NSArray *array3 = [NSArray arrayWithObjects:@"123", @"10", @"43", @"5", nil];
//使用block定义一个块方法
NSComparator ruleArray = ^(NSString *oil1, NSString *oil2) {
//字符串转为整型
NSInteger num1 = [oil1 integerValue];
NSInteger num2 = [oil2 integerValue];
//判断大小
if (num1 > num2) {
return NSOrderedDescending;//1
}
if (num1 < num2) {
return NSOrderedAscending;//-1
}
return NSOrderedSame;
};
NSArray *soft3 = [array3 sortedArrayUsingComparator:ruleArray];
NSLog(@"%@", soft3);
再来一个例子, 对一个学生数组, 按照学生成绩和姓名进行排序
Student *stu1 = [[Student alloc] initWithName:@"耿申" score:59.9];
Student *stu2 = [[Student alloc] initWithName:@"杨超" score:98];
Student *stu3 = [Student studentWithName:@"李高杰" score:80];
Student *stu4 = [Student studentWithName:@"葫芦娃" score:70];
//学生数组
NSArray *studentArray = [NSArray arrayWithObjects:stu1, stu2, stu3, stu4, nil];
//排序的学生数组
NSArray *sotr1 = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {
if ([obj1 score] > [obj2 score]) {
return -NSOrderedDescending;//1
}
if ([obj1 score] < [obj2 score]) {
return -NSOrderedAscending;//-1
}
return NSOrderedSame;
}];
NSLog(@"---------按分数排序--------");
for (Student *stu in sotr1) {
NSLog(@"%@", stu);
}
NSLog(@"---------按姓名排序--------");
NSArray *sort = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {
//获取两个相邻函数的名字
NSString *name1 = [obj1 name];
NSString *name2 = [obj2 name];
//先将汉字转化为拼音, 进行比较, 排序
//可变字符串1
NSMutableString *str1 = [NSMutableString stringWithString:name1];
//转成带声调的拼音
CFStringTransform((CFMutableStringRef)str1, NULL, kCFStringTransformToLatin, false);
//转成没有声调的拼音
CFStringTransform((CFMutableStringRef)str1, NULL, kCFStringTransformStripDiacritics, false);
//可变字符串2
NSMutableString *str2 = [NSMutableString stringWithString:name2];
//转成带声调的拼音
CFStringTransform((CFMutableStringRef)str2, NULL, kCFStringTransformToLatin, false);
//转成没有声调的拼音
CFStringTransform((CFMutableStringRef)str2, NULL, kCFStringTransformStripDiacritics, false);
return [str1 compare:str2];
}];
for (Student *stu1 in sort) {
NSLog(@"%@", stu1);
}
注: 这里面有一段方法是将汉字转化为拼音的, 不过有一定的局限性, 如果汉字是多音字的时候, 可能会转化的不太准确, 请大家慎重使用以上个人总结的一些东西, 如果大家发现有错的话, 欢迎提出来, 大家一起进步哦!