block的定义和使用,以及block与数组排序
2014-08-12 18:54
465 查看
// // main.m // 89_oc_classexam // // Created by Quan.Zh. on 14-8-9. // Copyright (c) 2014年 蓝鸥科技. All rights reserved. // #import <Foundation/Foundation.h> #import "Student.h" // 声明一个求和的函数 int sum(int a, int b); int sum(int a, int b) { int sum; sum = a + b; return sum; } // 给函数类型起别名 typedef int (*SUM) (int, int); // 给block起别名 typedef int (^MyBlock) (int, int); int main(int argc, const char * argv[]) { @autoreleasepool { #pragma mark block的定义、使用、block与变量的关系 // 写一个函数指针指向sum函数 // 指针的类型:int (*) (inr,int) // 变量名:p // 值:sum int (*p) (int, int) = sum; sum (19,20); p (12,33); // 声明一个block变量 // 类型:int (^) (int,int) // 变量名:myBlock int (^myBlock) (int, int); // block的值 myBlock = ^(int a, int b) { // ^标志着后边内容是一个block类型的 return a+b; }; // 返回值是int, // 参数是int,int // 定义三个block,实现:求差、商、积 int (^dilBlock) (int, int); dilBlock = ^(int a, int b) { return a - b; }; // block的简化写法1 int (^shangBlock) (int, int) = ^(int a, int b) { return a / b; }; // block的简便写法2:typedef int (^jiBlock) (int, int); jiBlock = ^(int a, int b) { return a * b; }; // 使用别名定义一个block MyBlock moBlock = ^(int a, int b) { return a % b; }; // block的使用和函数指针一样,在变量名后直接传递参数值 int a = 10, b = 20; NSLog(@"积 = %d", jiBlock(a, b)); NSLog(@"差 = %d", dilBlock(a, b)); NSLog(@"商 = %d", shangBlock(a,b)); NSLog(@"和 = %d", myBlock(a,b)); NSLog(@"摸 = %d", moBlock(a, b)); #pragma mark block与局部变量和全局变量的关系 // block对局部变量的修改值操作,需要在局部变量前添加__block修饰 // block对全局变量的修改,可以直接修改值 // block内部公用的变量可以在block之外统一定义,如: int beishu = 10; // 定义一个局部变量 MyBlock myBlock1 = ^(int a, int b) { return (a + b) *beishu; }; // block内部可以调用局部变量,但是在block内部更改局部变量的值时,局部变量需要用__block修饰 __block int beishu1 = 10; // 定义一个__block修饰的局部变量 MyBlock myBlock2 = ^(int a, int b) { beishu1 = 100; // 经过修饰的beishu1可以修改 // beishu = 100; // 未经__block修饰的beishu不可以修改值 return (a + b) * beishu1; }; #pragma mark block与数组排序 NSArray *array = @[@"123", @"23", @"54", @"345"]; NSComparisonResult (^sortArray) (id, id) = ^(id obj1, id obj2){ // 根据数值大小进行排序,首先要将字符串转化为整型类型 int i1 = [obj1 intValue]; int i2 = [obj2 intValue]; // 比较并返回两个值的大小 if (i1 > i2) { return NSOrderedAscending; } else if (i1 < i2) { return NSOrderedDescending; } return NSOrderedSame; }; // 把刚刚写的block作为参数,传递给sortedArrayUsingComparator:方法,让数组根据我们写的block进行排序 array = [array sortedArrayUsingComparator:sortArray]; // 打印结果 NSLog(@"%@",array); } #pragma mark 给学生按照姓名和年龄排序(使用block) // 初始化并创建一个学生对象 Student *stu1 = [[Student alloc] initWithNmae:@"Z三" age:24]; Student *stu2 = [[Student alloc] initWithNmae:@"L斯" age:23]; Student *stu3 = [[Student alloc] initWithNmae:@"W五" age:12]; Student *stu4 = [[Student alloc] initWithNmae:@"ZH刘" age:44]; // 将学生装进数组中 NSArray *stuArray = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4,nil]; // 定义一个排序的block // 根据姓名排序 NSComparisonResult (^paixuByName) (id, id); paixuByName = ^(id obj1, id obj2) { if ([[obj1 getName] compare:[obj2 getName]] > 0) { return NSOrderedAscending; } else if ([[obj1 getName] compare:[obj2 getName]] < 0) { return NSOrderedDescending; } else return NSOrderedSame; }; // 将上边定义的stuArray数组放在以下方法中,同时引用paixuByName,根据我们写的方法进行排序 stuArray = [stuArray sortedArrayUsingComparator:paixuByName]; for (int i = 0; i < stuArray.count; i++) { NSLog(@"%@",stuArray[i]); } // 根据年龄从小到大的排序 NSLog(@"按照年龄升序排序"); NSComparisonResult (^paixuByAge) (id, id); paixuByAge = ^(id obj1, id obj2) { if ([obj1 getAge] > [obj2 getAge]) { return NSOrderedDescending; } else if ([obj1 getAge] < [obj2 getAge]) { return NSOrderedAscending; } return NSOrderedSame; }; stuArray = [stuArray sortedArrayUsingComparator:paixuByAge]; for (int i = 0; i < stuArray.count; i++) { NSLog(@"%@",stuArray[i]); } //************************************************************************************************// // 使用block排序的常用简便写法(block其实就是一个参数):选中参数按回车,系统自动生成block的实现头; stuArray = [stuArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { if ([obj1 getAge] > [obj2 getAge]) { // 排序代码 return NSOrderedDescending; } else if ([obj1 getAge] < [obj2 getAge]) { return NSOrderedAscending; } return NSOrderedSame; }]; for (int i = 0; i < stuArray.count; i++) { NSLog(@"@@@@@@@@@@@@@%@",stuArray[i]); } //***********************************************************************************************// } return 0; }
相关文章推荐
- OC中Block语法、Block使用以及通过Block实现数组排序
- Objective-C中Block语法、Block使用以及通过Block实现数组排序
- 第九节 java数组的介绍,数组定义,数组排序,Arrays类静态方法使用,以及源码解析
- OC中Block语法、Block使用以及通过Block实现数组排序
- JAVA数组的定义以及使用1
- 学生类封装 , (链表)插入排序成绩 无动态数组 ,动态开辟空间 以及静态函数,数据成员的使用
- JAVA数组的定义以及使用1
- 函数指针以及函数指针数组的定义与使用
- java方法的定义以及数组的使用
- NSSortDescriptor使用注意以及直接排序字符串数组
- 使用快速排序算法对字符串数组进行排序(复习指向指针的指针以及指针数组的使用)
- 黑马程序员--C语言之数组的定义以及使用
- 使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现
- 实验报告->数组的定义和使用->判断数组中的偶数并删除,奇数紧凑排序
- j2se学习中的一些零碎知识点4之字符串,数组和异常(使用数组实现冒泡排序算法和选择排序以及二分法查
- JAVA数组的定义以及使用1
- ObjectC----Block用法以及用Block实现数组排序
- Block的定义,以及使用
- NSSortDescriptor使用注意以及直接排序字符串数组
- C#委托的简单学习:定义委托和使用、Func<int f1,out r1>、给自定义的类或数组排序(冒泡排序)