Block 实践

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

原文地址:https://www.cnblogs.com/EchoHG/p/8470907.html