• 【block作为函数的参数之二 Objective-C语言】


    一、例如,我有一个TestArray类:

    类里面有一个属性,这个属性是1个数组,是1个10个长度的数组:

    #import

    @interface TestArray:NSObject

    {

    int _arr[10];

    }

    end

    1.现在的需求是,创建TestArray对象以后,这个数组里面的10个元素就已经赋好值了:

    在TestArray.m文件中

    #import “TestArray.h”

    @implementation TestArray

    - (instancetype)init

    {

    if(self = [super init]

    {

    for(int i=1;i < 11;i++)

    _arr[i-1] = i * 10;

    }

    return self;

    }

    @end

    这时候,这个TestArray对象一旦创建,这个对象是不是有一个数组啊,有一个10个长度的数组,每个元素的值分别是,10,20,30,40,50,60,70,80,90,100

    2.现在我要做一件事情,做一件什么事情呢,我现在要为这个TestArray类写一个方法,写一个什么方法呢,将这个对象的数组里面的每一个元素遍历出来,换句话说,就是把

    {

    int _arr[10];

    }

    里面的每一个元素,写个循环打印出来就行了吧

    在TestArray.h文件中

    - (void)bianLi;

    在TestArray.m文件中

    - (void)bianLi

    {

    for(int i=0;i<10;i++)

    {

    NSLog(@“%d”,_arr[i]);

    }

    我们试一下啊,在main.m文件中

    #import

    #import “TestArray.h”

    int main()

    {

    TestArray *arr = [TestArray new];

    [arr bianLi];

    return 0;

    }

    输出:

    10 20 30 40 50 60 70 80 90 100

    二、但是现在有一个问题,我拿到这个数组里的每一个值,可能不是想打印出来,我要把它们存到文本文件里面去,怎么办

    所以,这句话就是错误的了:

    - (void)bianLi

    {

    for(int i=0;i<10;i++)

    {

    //这句话有问题

    //每遍历出来1个元素,方法自己就自作主张的打印,但是可能不是想打印

    //这个元素如何处理,你返回行不行啊,不行,因为return arr[i];只能返回1个,但是我要全部拿到

    //所以这个时候我遍历出来的每1个元素如何处理,方法内部确定吗,不确定

    //谁确定如何处理,是不是调用者确定如何处理啊

    //所以这个时候,我就要把遍历出来的每1个元素交给谁去处理,对,交给调用者去处理

    //这个时候,就要将遍历出来的元素交给调用者去处理

    //也就是说,要让调用者自己写1段代码,来处理遍历出来的元素

    //怎么做,怎么办,block,对不对

    //让调用者写1段block,写个block代码段,来处理这个遍历出来的元素

    //所以,如果说,我想让遍历者传1个代码段过来的话,这个代码段有没有返回值

    //现在,我这个方法的内部,是不是把每一个元素的值遍历出来了啊

    //加入我遍历出来的值是:10 20 30 40 50

    //这个时候,我是不是要把每一个元素交给谁去处理,是不是交给调用者去处理啊

    //也就是说,我要让调用者自己写一段代码来处理这些数据啊

    //那么这个代码段有没有返回值,没有

    //有没有参数,有,就是这些数据给它

    NSLog(@“%d”,_arr[i]);

    }

    }

    1.所以,TeatArray.h文件这么改:

    - (void)bianLiWithBlock:(void (^)(int val))processBlock;

    //没有返回值,void,尖尖(^),有没有参数,有,几个,是不是1个参数啊,就是遍历出来的那个数据吧,(int val),好,取个名字啊,叫什么呢,就叫processBlock吧,处理代码段

    在TestArray.m文件中

    - (void)bianLiWithBlock:(void (^)(int val))processBlock

    {

    for (int i=0;i<10;i++)

    {

    //NSLog(@“%d”,_arr[i]);

    //这个时候就不要去打印了

    //这个时候,你遍历出来的元素就不要去打印了,不要打印了吧,交给谁去做处理,交给这个block代码段里面的代码去处理

    //调用这个processBlcok,把遍历出来的元素交给它

    processBlock(_arr[i]);

    //这个时候,我就把这个遍历出来的数据传给了这个代码段吧,这个代码段里是不是可以写代码,拿这个参数去处理了吧

    //这个时候怎么处理,是不是调用者自己写代码,自己说了算啊

    }

    }

    好,我们试一下啊,在main.m文件中

    int main()

    {

    TestArray *arr = [TestArray new];

    [arr bianLiWithBlock:^(int val){

    code;

    };

    return 0;

    }

    //好了,你看啊,这个代码段

    是不是又个参数啊(int val)

    这个参数是不是就是我们刚刚遍历出来的每一个元素啊

    这时候,我怎么处理呢,我打印一下吧

    [arr bianLiWithBlock:^(int val){

    NSLog(@“val = %d”,val +1);

    }];

    输出:

    val = 11 val = 21 val = 31 val = 41 val = 51 val = 61 val = 71 val = 81 val = 91 val = 101

    有的调用者想把这些数据存到数据库里面去,那你只需要在这里面写代码,把这个val存到数据库里面去就可以了吧

  • 相关阅读:
    群体优化算法---蜂群优化算法应用于数据挖掘
    【C语言】从扫雷玩家到开发者
    docker save & docker export 区别
    40个高质量软件工程毕设项目分享【源码+论文】(四)
    TensorRT概述
    Linux-文件管理命令
    数字化时代,数据仓库究竟是干什么的?
    MyBatis select标签
    QT实现任意阶贝塞尔曲线绘制
    顺丰接口对接-订单创建与取消(java单元测试)
  • 原文地址:https://blog.csdn.net/madoca/article/details/126962626