为什么我不能在动态输入块中使用BOOL变量?

时间:2014-08-26 16:13:11

标签: ios objective-c-blocks

我有一个可以执行带回调的任务块的函数:

typedef void (^TaskCallback)();
typedef void (^Task)(TaskCallback task_callback);

void execute(Task task, TaskCallback task_callback)
{
    task(task_callback);    
}

TaskCallback块可以正常使用动态参数,例如:

TaskCallback callback = ^ (int a, int b) {
    NSLog(@"a = %i b = %i", a, b);
};

Task task = ^ (TaskCallback callback) {
    callback(4, 2);
};

task(callback);

The output is : a = 4 b = 2

但是当我将BOOL变量传递给TaskCallback块时:

TaskCallback callback = ^ (int a, BOOL b) {
    NSLog(@"a = %i b = %i", a, b);
};

Task task = ^ (TaskCallback callback) {
    callback(4, NO);
};

task(callback);

编译器将其视为错误:

incompatible block pointer types initializing 'TaskCallback' (aka 'void (^)()') with an    expression of type 'void (^)(int, BOOL)'
    TaskCallback callback = ^ (int a, BOOL b) {
                 ^          ~~~~~~~~~~~~~~~~~~~

我尝试了很多案例,一旦在块args中添加BOOL变量,我就会收到错误。


*似乎不支持所有低于32位的数据类型,例如BOOL float char short int8_t {{1等等

1 个答案:

答案 0 :(得分:1)

您没有将TaskCallback的输入参数声明为int, BOOL。我不确定为什么使用int, int有效*,因为你已经声明TaskCallback是一个不接受输入参数的块。在语言规范中可能有一个问题的答案,但是如果你想为你的回调块使用输入,你必须在块声明中指定它们。

typedef void (^TaskCallback)(int a, BOOL b);

*我能找到答案的最接近的答案如下LLVM language specification for blocks

  

不带参数的块必须在参数列表中指定void   [voidarg.c]。空参数列表不表示为K& R.   提供一个未指明的参数列表。

所以我猜测一个空参数声明默认为可变数量的整数,这就是你的int, int块有效的原因,但任何其他声明都是类型不匹配。