Objective-C块参数

chm*_*chm 10 parameters declaration objective-c objective-c-blocks

假设我们有这个块:

int (^aBlock)(BOOL) = ^(BOOL param) { ...
Run Code Online (Sandbox Code Playgroud)

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

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

Car*_*zey 12

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

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

id (^thatBlock)(id obj, NSUInteger index) = thisBlock;
Run Code Online (Sandbox Code Playgroud)

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

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

thatBlock(@[],@{},@"");
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Kju*_*uly 5

为什么语法中我们必须列出参数类型两次?

该块是这样设计的,因此您可以这样做:

int (^aBlock)(BOOL);

aBlock = ^(BOOL param) {
  ...
};
Run Code Online (Sandbox Code Playgroud)

它只是喜欢

- (int)aMethodWithParam:(BOOL)param;

- (int)aMethodWithParam:(BOOL)param {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这两种类型会有所不同吗?

不,而且,类型的顺序应该相同,即:

int (^aBlock)(BOOL, NSString*) = ^(BOOL param, NSString *aString) {
  ...
};
Run Code Online (Sandbox Code Playgroud)

这是一个清晰的块图:

图像