我决定尝试在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");
}];
是否无法匿名定义多个块并将它们传递给需要多个块参数的方法?如果是这样,那就是失望。
答案 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");
}
];