block初窥

作者: 墨竹轩客 | 来源:发表于2017-08-29 18:39 被阅读0次

一.block的简单使用

1.block声明

block变量的声明格式为: 返回值类型 (^block名字)(参数列表);

  • 声明一个无返回值,有两个NSString参数,名字为ablock的block
    void (^ablock)(NSString * str1,NSString * str2);
  • 形参变量名可以省略,只留下形参类型
    void (^ablock)(NSString * ,NSString * );

2.block赋值

block的赋值格式为: ablock变量=^(参数列表){函数体} ;

    //1.在此先声明一个名为ablock的block
    void (^ablock)(NSString * str1,NSString * str2);

    //2.在此将等号右边的block代码块的实现赋值给ablock变量
    ablock = ^(NSString * str1,NSString * str2){
        NSLog(@"%@,%@",str1,str2);
    };

    //3.在这里调用ablock
    ablock(@"lisj",@"ddsd");

block 赋值格式
block变量 = ^返回值类型(参数列表){函数体};

  • 其中,返回值类型可以书省略,因为编译器可以根据存储代码块的变量中,确定返回值的类型.

3. 在声明block的同时对其进行赋值
  • 简化block的声明和定义的过程,一步到位,直接调用即可
//1.声明block,并定义
   int (^myblcok) (int,int) = ^ (int c,int d){
        return c*d;
   };
//2.有参数有返回值的block调用
    NSLog(@"%d", myblcok(4,5));//这里会在控制台打印20
  • 如果没有参数列表,赋值时,参数列表可以省略
//1.无返回值无参数block的声明及定义
 void (^oneblcok) () = ^ {
        NSLog(@"hello world ");//打印hello world
    };
//2.无参,无返回值block的调用
 oneblcok();

二.block的进阶使用

1.block作为C函数参数

  • 第一种语法
//1.声明一个求和函数
    void  useBlockInC(int (^block)(int a ,int b)){
    NSLog(@"%d",block(30,30));
}

//2.定义一个block,用来实现求和的功能(主要逻辑部分,根据自己的需求在这里写代码)
    int (^addBlock)(int,int )=^(int x,int y){
        return  x+y;
    };

//3.调用函数
    useBlockInC(addBlock);
  • 第二种语法(第一种的简化版--常用)
    • 将第一种语法中的第2步和第3步结合起来,简化语法
//1.声明一个求和函数(第一步相同)
    void  useBlockInC(int (^block)(int a ,int b)){
    NSLog(@"%d",block(30,30));
}

//
//简化,把2和3结合起来,简化之后如下方式
//示例1
    useBlockInC(^int(int a, int b) {
        return a*b;//这里的代码逻辑根据项目需求写,可灵活多变,只要符合语法
    });
//示例2
     useBlockInC(^int(int a, int b) {
        return a-b;//比如变成减法
    });

  • block用作函数参数,相当于传进来了一种数据类型,可以拿到相应的参数来做自己想做的事.
  • block一般用作函数参数时,多为无返回值类型.

2.block作为OC函数参数

  • 第一种语法
//1:写自己需要用到block做参数的函数
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
    block(@{@"name":@"myName is bob"});
}

//2:声明一个block变量,并把具体的代码块赋值给block变量
    void (^dicBlock) (NSDictionary *) = ^(NSDictionary * dic){
        for (NSString * item in dic) 
        {
            NSLog(@"%@",item);  
        }
    };
//3:调用函数,将block当做参数传入函数
    [self useBlockInOC:dicBlock];
    
  • 第二种语法
    • 简化版(第二步和第三步合并)
//1:写自己需要用到block做参数的函数
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
    block(@{@"name":@"myName is bob"});
}
//2.调用函数,代码块内写逻辑代码
    [self useBlockInOC:^(NSDictionary *dic) {
        NSLog(@"%@", [dic objectForKey:@"name"]);
    }];

3. 使用typedef 定义block类型,可以简化block在C中的使用

//第一步,使用typedef声明block类型typeBlock
  typedef void (^typeBlcok) (NSArray *);

//第二步,创建一个block的变量,并把block的代码块赋值给这个新创建的变量
  typeBlcok newBlcok =^(NSArray * arr){
        for (id item  in arr) {
            NSLog(@"%@",item);
        }
    };

//第三步:调用block,记得传入参数
    NSArray * arr=@[@"战狼2",@"吴京",@"敦刻尔克",@"蜘蛛侠",@"极限挑战",@"美丽的五险",@"你好,佳人",@"成语大会",@"创业故事"];
    
    newBlcok(arr);//调用block


4.使用typedef简化block在OC中的使用方法

  • 第一种语法
//1.使用typeBlock声明一种block的类型,简化block的用法
typedef void(^typeBlock) (NSDictionary * dic);

//2.写自己需要的函数
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
    block(@{@"name":@"myName is bob"});
}
//3.用声明的typeBlock类型创建一个block变量,然后把具体的代码块赋值给对象
    typeBlock block = ^(NSDictionary *dic) {
        NSLog(@"%@", [dic objectForKey:@"name"]);
    };
    
//4.调用函数,将block当做参数传入函数
    [self useBlockInOC:block];
    

  • 第二种语法
//1.使用typeBlock声明一种block的类型,简化block的用法
typedef void(^typeBlock) (NSDictionary * dic);

//2.写自己需要的函数
-(void)useBlockInOC2:(typeBlock)block{
    block(@{@"name":@"myName is bob"});
}
//3.调用函数,简化版,代码块内直接写逻辑代码
    [self useBlockInOC:^(NSDictionary *dic) {
        NSLog(@"%@", [dic objectForKey:@"name"]);
    }];

解释:无论是C语言或者是OC语言,第二种语法最常用.第一种语法可以看做是第二种语法的来源或者原理

相关文章

  • block初窥

    一.block的简单使用 1.block声明 block变量的声明格式为: 返回值类型 (^block名字)(参数...

  • 比特币源码研读(3)数据结构-交易Transaction

    上一篇:数据结构-区块Block 首先,通过blockchain.info查看一笔交易的基本数据结构: 源码初窥 ...

  • 初窥

    初窥世界的美好 白的风 白的肌肤 和盈盈一握的腰肢 在你的头发里 有一个蓝色大海的梦 蓝的帆船和蓝的浪花 自然是美...

  • 初窥

    这个积分管理项目已经到收尾的阶段了,感受良多。 对于错误处理这方面这周我的规划也更为清楚一些了。明天如果能够预期结...

  • 初窥南京

    古鸡鸣寺门外,一条长满爬山虎的墙。 城墙下的绿植。 1912街区,没有什么能过阻挡,我对自由的向往。 午后墙壁上斑...

  • 初窥HTTP

    要知道HTTP肯定要先知道WWW,下面我用思维导图来介绍下: 1,弄懂了上图的关系,接下来着重介绍HTTP。 先介...

  • 初窥Scrapy

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据...

  • mongodb初窥

    启动MongoDB服务:在 MongoDB 安装目录的 bin 目录下执行mongod show dbs -- 显...

  • RxSwift初窥

    前言 很久一段时间没写博客了,一方面是自己各种事情折腾,二是新项目开始用Swift了,边学边做忙死了,现在终于快忙...

  • Hbase初窥

    Hbase能做什么 海量数据的存储 海量数据的查询 企业数据海量查询 项目需求功能 海量数据 实时查询 场景复杂 ...

网友评论

    本文标题:block初窥

    本文链接:https://www.haomeiwen.com/subject/zswodxtx.html