定义返回Block的函数

鉴于Block与函数的相似性,先从返回函数指针的函数入手

返回函数指针的函数

int fun1(int arg)
{
    return arg + 1;
}

int fun2(int arg)
{
    return arg + 100;
}

int(*generateFun(const char *name))(int)
{
    if (name == "fun1")
        return fun1;
    else
        return fun2;
}
int main()
{

    int (*fun_ptr)(int) = generateFun("fun2");
    int ret = fun_ptr(30);
    printf("%d
",ret);
    return 0;
}

函数原型为int(*generateFun(const char *name))(int)

  • 最外层为函数返回值的说明,返回值是一个这样的函数指针int (*)(int)
  • 里层则为函数名以及函数形参
  • generateFun接受const char *形参,并返回一个函数指针(形参为int,返回值为int的函数指针)

返回Block的函数

int (^func())(int)
{
    return ^(int count){return count*2;};
}
int main()
{
    int (^blk)(int) = func();
    int result = blk(12);
    printf("%d
",result);
    return 0;
}

函数原型为int (^func())(int)

  • 最外层为函数返回值的说明,返回值是一个这样的Blockint (^)(int)
  • 里层则为函数名以及形参列表

更好的写法

通过typedef,可以有更直观的变现方式

typedef int (^blk_type)(int);

blk_type func()
{
    return ^(int count){return count*2;};
}

其实从typedef的表达形式也可以推出函数的定义语法,只是把类型名变为函数名和参数列表。

PS:《Objctive-C高级编程》中87页有第一个代码段有点错误。

原文地址:https://www.cnblogs.com/rainySue/p/ding-yi-fan-huiBlock-de-han-shu.html