调用内联块指定返回类型和参数

时间:2011-09-01 18:07:06

标签: objective-c ios objective-c-blocks

我决定尝试在Objective-C中使用块来控制流,并且在内联调用多个块时遇到了一些问题。

我有一个OOBoolean,它是BOOL原语的包装器,并提供了以下方法:

+ (id) booleanWithBool: (BOOL) boolPrimitive;

- (id) initWithBool: (BOOL) boolPrimitive;

- (void) ifTrueDo: (void (^) ()) trueBlock 
        ifFalseDo: (void (^) ()) falseBlock;

- (void) ifTrueDo: (void (^) ()) trueBlock;

- (void) ifFalseDo: (void (^) ()) falseBlock;

我这样使用这个类没有问题:

OOBoolean* condition = [OOBoolean booleanWithBool: (1 + 1 == 2)];

id trueBlock = ^(){
    NSLog(@"True.");
};

id falseBlock = ^(){
    NSLog(@"False.");
};

[condition ifTrueDo: trueBlock ifFalseDo: falseBlock];

我得到了“真实”的结果。但是在尝试此操作时我一直遇到语法错误:

OOBoolean* condition = [OOBoolean booleanWithBool: (1 + 1 == 2)];

[condition ifTrueDo:(void (^)()) {
    NSLog(@"True");
} ifFalseDo:(void (^)()) {
    NSLog(@"False");
}];

是否无法匿名定义多个块并将它们传递给需要多个块参数的方法?如果是这样,那就是失望。

2 个答案:

答案 0 :(得分:7)

这是可能的。

你那里的括号太多了。试试这个:

[condition ifTrueDo:^() { NSLog(@"True"); } ifFalseDo:^() { NSLog(@"False"); } ];

编辑: 您的块语法略有不正确。

如果你想要包含返回类型和参数,你应该使用更接近这个的东西:

[self ifTrueDo:^ void (void) { NSLog(@"True"); } ifFalseDo:^ void (void) { NSLog(@"False"); } ];

英文:

^ [return type] ([parameter list]) {[block content]}

答案 1 :(得分:1)

问题是你的方法声明需要一个块返回void(无):

- (void) ifTrueDo: (void (^) ()) trueBlock 
        ifFalseDo: (void (^) ()) falseBlock;

但是,您稍后会使用签名(id ^()())调用此传递块:

[condition ifTrueDo:(id (^)()) {
    NSLog(@"True");
}         ifFalseDo:(id (^)()) {
    NSLog(@"False");
}];

只需删除“id”部分,如下所示 - 注意:我尝试了这个并且编译时没有警告:

[condition ifTrueDo:^{
          NSLog(@"True");
     }
     ifFalseDo:^{
          NSLog(@"False");
     }
 ];