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

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

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

#import <Foudation/Foundation.h>

@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 <Foundation/Foundation.h>

#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存到数据库里面去就可以了吧

猜你喜欢

转载自blog.csdn.net/madoca/article/details/126962626