Objective-C block 参数

标签 objective-c parameters objective-c-blocks declaration

假设我们有这个 block :

int (^aBlock)(BOOL) = ^(BOOL param) { ...

我目前对此的理解是:第一个int是返回类型,(^aBlock)(BOOL)给出了方法的名称和它的类型参数,而 = ^(BOOL param) 是 block 内的参数名称...再次加上参数的类型?

为什么语法必须列出两次参数类型?这两种类型会有所不同吗?

最佳答案

这不完全是“两次列出参数类型”,您在第一种情况下声明了 block 变量的类型,而在第二种情况下您定义了一个 block 文字。 然后,您将文字分配给变量的值。你甚至可以做这样的事情,这是等价的,并且更好地说明了一个事实,即尽管与 assign 语句相关联,但它们实际上是两个完全独立的声明:

id thisBlock = ^id (id x, NSUInteger idx) {
    NSLog(@"x = %@",x);
    return x;
};

id (^thatBlock)(id obj, NSUInteger index) = thisBlock;

它们彼此独立的事实意味着尝试提供某种类型的输入信息从表达式左侧到右侧的转移或继承可能是不正确的。是的,类型可以不同——考虑一下这段代码编译和执行得很好:

id (^thatBlock)(NSArray *, NSDictionary *, NSString *) = ^id (id x, id y, id z) {
    NSLog(@"x = %@",x);
    return x;
};

thatBlock(@[],@{},@"");

希望这对您有所帮助!

关于Objective-C block 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12889030/

相关文章:

iphone - isKindOfClass 和 NSStringFromClass 不同意 UIApplicationDelegate

objective-c - 如何将一个 block 作为参数传递给 Objective C 中的另一个 block

ios - AVCaptureMetadataOutput setMetadataObjectTypes 发现不支持的类型

objective-c - Objective-C 中的快速枚举与 NSEnumerator

c++ - ROS 启动文件设置变量值

C++ 如何使用从一个函数到另一个函数的变量?

ios - 向方法添加附加行为而无需子类化

ios - 当 block 内的 ivar 可能被释放时,管理内存的最佳方法是什么?

ios - 如何随机化方法?

c++ - 声明的含义是什么,例如无效a(字符串b = 0)