假设我们有这个 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/