• 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

  • 相关阅读:
    FunctionGraph无缝集成Express应用
    三分钟迁移Spring boot工程到Serverless
    分布式数据库中间件使用经验分享
    基于OAS设计可扩展OpenAPI
    从一次小哥哥与小姐姐的转账开始, 浅谈分布式事务从理论到实践
    分布式数据库DDM Sidecar模式负载均衡
    Redis缓存数据库安全加固指导(二)
    数据存储课后作业
    GrideVlew提供点击按钮添加新数据,单击项目修改,长按删除功能
    AutoCompleteTextView,Spinner,消息提示
  • 原文地址:https://www.cnblogs.com/EchoHG/p/8470907.html
Copyright © 2020-2023  润新知