【block作为函数的返回值 Objective-C语言】

一、例如:

在main.m文件中,我这儿有1个函数:

import <Foundation/Foundation.h>

- (void)ttt

{

//code;

}

int main()

{

//code;

}

我这个函数里面,有一个block,void (^block1)(),给它赋1个代码段 ^void (){};

import <Foundation/Foundation.h>

- (void)ttt

{

void (^block1)() = ^ {

NSLog(@“-----------”);

NSLog(@“-----------”);

NSLog(@“-----------”);

};

}

int main()

{

//code;

}

这个时候,这个ttt()函数里面,是不是有1个block1变量啊

我能不能把这个block1变量的值,也就是这个代码段:

^ void () {

NSLog(@“-------------”);

NSLog(@“-------------”);

NSLog(@“-------------”);

};

返回给调用者呢?

可以

那怎么写呢

是不是应该改返回值啊

void ttt()

改成

void (^)() ttt()

这个地方,(^)为什么不写名字

因为我们说过,返回值是不是只要写类型就可以了吧

但是这样写会报错,因为编译器看不懂了,所以如果要把block作为返回值的话,就只能用typedef了

typedef void (^NewType)();

NewType ttt(){

void (^block1)()= ^ {

NSLog(@“---------”);

NSLog(@“---------”);

NSLog(@“---------”);

};

return block1

}

如果说你想把block作为返回值的话,这时候就必须用typedef了啊,用这个短类型的啊

typedef void (^NewType)();

二、当将block作为函数的返回值的时候,返回值的类型就必须要使用typedef定义的短类型

这个时候,怎么去执行呢,执行就很简单了,在main.m文件中

调用这个ttt();函数,这个函数是不是返回block类型的啊,也就是NewType类型的啊

好,来一个type接收一下就可以了

NewType type = ttt();

这个时候,ttt()这个函数就会返回这个block的值

然后把这个block的值赋给type

然后,执行一下这个type里面的代码

type();

输出:

-----------------

-----------------

-----------------

三、block与函数的异同

1.相同点:都是封装1段代码

2.不同点:

1)block是1个数据类型,函数是1个函数

2)我们可以声明block类型的变量,函数就只能是个函数

3)block可以作为函数的参数,而函数不能直接作为函数的参数,除非你用指向函数的指针,但是那个东西基本上用不上了,都用block代替了。

猜你喜欢

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