+ (id)checkWithBlock:(BOOL (^)(id))block
{
return [[[OCMBlockConstraint alloc] initWithConstraintBlock:block] autorelease];
}
[OCMArg checkWithBlock:^(id value) { return YES && YES; }];
我正在返回YES&&返回BOOL的块是,但是收到此错误:
不兼容的块指针类型将'int(^)(__ strong id)'发送到'BOOL(^)(__ strong id)'的参数
答案 0 :(得分:3)
调用块方法时,你错过了BOOL声明。如果您使用Xcode的自动完成功能,它应该为您创建:
[OCMArg checkWithBlock:^BOOL(id value) {
return YES && YES;
}];
答案 1 :(得分:1)
有一个答案,并有一个很好的评论。但是,我们必须把事情放在一起才能理解:
一个。在C中,逻辑和操作的结果是int
。从标准(ISO / IEC 9899:TC3):
语义 和&&如果两个操作数的比较不等于0,则运算符应为1;否则,它产生0.结果的类型为int。
B中。苹果的某个人决定推断出类型和更强的打字类型。这对于C来说是个坏主意,因为C不支持推断类型并且输入类型很弱。它解决了隐式(或显式)转换(弱类型)的问题类别,而不是类型推断和类型强度。因此块的类型强度不适合C。
℃。解决方案#1(旧):原始解决方案是,显式转换返回值:
return (BOOL)(YES && YES);
d。解决方案#2(新):后来许多开发人员抱怨苹果公司有非C-ish强类型与块的类型推断相结合,而苹果公司为其提供了明确的块返回类型,如同在remus'回答。如果您有这样的显式类型,则返回表达式会隐式转换为该类型。
ž。故事的有趣部分:即使是苹果公司也失败了他们在Swift中再次尝试的推断类型。如果你有超过1 + 2,它会更加复杂和混淆。你应该谨慎使用的一个很酷的功能"斯威夫特的东西。