OC中的Block(块语法)相关知识
2015-07-24 20:04
423 查看
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);
}
注: 这里面有一段方法是将汉字转化为拼音的, 不过有一定的局限性, 如果汉字是多音字的时候, 可能会转化的不太准确, 请大家慎重使用
以上个人总结的一些东西, 如果大家发现有错的话, 欢迎提出来, 大家一起进步哦!
格式:
返回值类型: (^)(参数类型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);
}
注: 这里面有一段方法是将汉字转化为拼音的, 不过有一定的局限性, 如果汉字是多音字的时候, 可能会转化的不太准确, 请大家慎重使用
以上个人总结的一些东西, 如果大家发现有错的话, 欢迎提出来, 大家一起进步哦!
相关文章推荐
- 关于Hibernate的配置文件参数详解
- 关于java基础--动态代理
- 安卓天天练练(六)红黄绿灯作业
- hdu 3662 3D Convex Hull (三维凸包模板)
- Tourism Planning(HDU 4049状压dp)
- Maven安装配置(一)
- 杭电2091 空心三角形
- 关于Hibernate框架的基础详解
- BZOJ 2783 JLOI 2012 树 乘+二分法
- 交叉编译环境软件搭建
- JavaScript入门篇 第一天
- 黑马程序员——第八篇_内部类
- C语言-字符串逆序
- Scala基础编程指南
- hdu5245 求期望
- 机房收费系统之删除用户
- hdoj 1047 Integer Inquiry
- getopt在Python中的使用
- UVA alive 4487 Exclusive-OR(加权并查集+异或运算的理解)
- vim 替换命令