使用&&在return语句中导致它成为一种int?

时间:2014-11-13 02:09:22

标签: objective-c

+ (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)'的参数

2 个答案:

答案 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,它会更加复杂和混淆。你应该谨慎使用的一个很酷的功能"斯威夫特的东西。