• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Harley
博客园    首页    新随笔    联系   管理    订阅  订阅

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

 

posted @ 2018-02-25 22:12  Harely  阅读(178)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3