我有一个可以执行带回调的任务块的函数:
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等等
答案 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
块有效的原因,但任何其他声明都是类型不匹配。