gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:39:05 25 4
gpt4 key购买 nike

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

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

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

TaskCallback block 可以很好地处理动态参数,例如:

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 block 时:

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) {
^ ~~~~~~~~~~~~~~~~~~~

我试过很多情况,一旦在 block 参数中添加一个 BOOL 变量,我就会得到错误。


*好像不支持所有小于32位的数据类型,比如BOOL float char short int8_t uint16_t

最佳答案

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

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

*我能找到的最接近答案的是 LLVM language specification for blocks 中的以下内容:

A Block that takes no arguments must specify void in the argument list [voidarg.c]. An empty parameter list does not represent, as K&R provide, an unspecified argument list.

所以我猜测空参数声明默认为可变数量的整数,这就是为什么你的 int, int block 可以工作,但任何其他声明都是类型不匹配的原因。

关于ios - 为什么我不能在动态输入 block 中使用 BOOL 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25510488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com