OC版
函数中无参无返回值
/*
作为函数参数类型的格式
返回值类型 (^)(形参列表)
*/
CZPerson.h
1 - (void) test:(void (^)(void))block;
CZPerson.m
1 - (void)test:(void (^)())block{ 2 NSLog(@"test"); 3 block(); 4 }
调用:
1 - (void)test{ 2 CZPerson *person = [CZPerson new]; 3 [person test:^{ 4 NSLog(@"哈哈哈哈"); 5 }]; 6 }
打印结果
函数中有参有返回值
CZPerson.m
- (int) average:(int (^)(int num1, int num2))sum{ return sum(10, 20) /2; //num1, num2是通过这个sum传到外面的,不是我们在这里用到num1和num2的值(如果这样使用sum(num1, num2), 会报错)。在这里将10赋值给这个形参blok块sum中的num1,20赋值给num2; }
感悟:average方法的参数不是num1和num2,而是sum这个块整体。(int num1, int num2)相对于 sum(10, 20)来说num1和num2是形参,将值传给了num1和num2.
调用:
CZPerson *person = [CZPerson new]; // 这里的num1和num2是从这个average方法中的参数block传来的,给这个block使用的 int avar = [person average:^int(int num1, int num2) { return num1 + num2; }]; NSLog(@"----->%d", avar);
打印结果:
获取局部变量的值
1 /* 2 在block中可以访问局部变量的值 3 默认在block内部不能修改局部变量的值 4 如果修改局部变量的值,要再定义这个变量的时候,在前面加上__block 5 */ 6 7 __block int num =10; //表示block中的这个变量要与num保持一致,都是变量 8 void (^test)(void) = ^{ 9 num = 20; //如果不加block,这会报错。因为这个block不是变量了,因为它放入block后,num表示的是这个10的值 10 NSLog(@"%d", num); 11 }; 12 13 test(); 14 NSLog(@"--->%d",num);
打印结果:
Swift版
直接上代码
1 var arr = [20, 9, 100, 34, 89, 39]; 2 // (_ num: Int, _ value: Int) -> Bool 闭包Closure参数类型 3 func hasClosureMatch(arr: [Int], value: Int, cb:(_ num: Int, _ value: Int) -> Bool) -> Bool { 4 for item in arr { 5 // 只是调用cb 闭包closure里面的函数,不管如何实现 6 // 类似oc 的blocks,c 的函数指针 7 if cb(item, value) { 8 return true 9 } 10 } 11 return false 12 }
调用
1 // Closure, func closure(_ num: Int, _ value: Int) -> Bool, 在这里这个闭包相当于一个变量,里面保存了一段代码,当用到这个闭包时才会跳进闭包里面的代码 2 var v1 = self.hasClosureMatch(arr: arr, value: 400) { (num, value) -> Bool in 3 return num >= value 4 } 5 6 print("v1 is (v1)")
结果:
v1 is false
另一种参数简单模式
1 let v2 = self.hasClosureMatch(arr: arr, value: 10) { 2 // 没有写类型(_ num: Int, _ value: Int) -> Bool 3 // 这里$0 表示 num, $1表示 value,用到了shell编程 4 return $0 < $1 5 } 6 7 print("v2 is (v2)")
结果:
v2 is true