【问题标题】:Casting nil in block在块中铸造 nil
【发布时间】:2013-01-10 13:23:43
【问题描述】:

我今天刚刚快速玩积木,我遇到了错误:

NSString *(^testBlock)(int) = ^(int option) {
    if (option == 1) return @"ONE";
    if (option == 2) return @"TWO";
    return nil;
};
NSLog(@"OUTPUT: %@", testBlock(4));
Return type 'void *' must match previous return type 'NSString *' when block literal has unspecified explicit return type

如果没有输入“1”或“2”,我真的想返回 nil,因此我决定简单地将最终返回值转换回 NSString,使用:

NSString *(^testBlock)(int) = ^(int option) {
    if (option == 1) return @"ONE";
    if (option == 2) return @"TWO";
    return (NSString *) nil;
};

这很好用,我只是好奇这是否是正确的解决方案,甚至是不好的做法,因为我以前从未考虑过强制转换 nil?

【问题讨论】:

  • 感谢 Sulthan 重新格式化代码。

标签: iphone objective-c cocoa-touch objective-c-blocks


【解决方案1】:

这不是最好的方法。

您应该将第一行更正为:

NSString *(^testBlock)(int) =  ^NSString*(int option){
    if(option == 1) return @"ONE"; 
    if(option==2) return @"TWO";
    return nil;
};

这样,块文字具有指定的返回类型并且错误消失了。正确。

编辑:添加对初始错误的解释:

没有返回类型的块将具有编译器推断的返回类型(函数不会发生这种情况)。当块中有 2 个不同类型的返回语句时(注意 nil 是 void*),编译器无法推断返回类型并报告错误。 要修复该错误,您必须手动指定返回类型以避免编译器产生歧义。

作为一个好习惯,除非您使用多态性,否则永远不要从同一个块返回不同的类型。

【讨论】:

  • 很好,解决方案看起来很清晰,有没有参考解释这种情况下的返回类型要求的文档?
  • 谢谢你,我错过了在定义中声明返回类型,然后我错误地(如你所说)试图在其他地方解决问题,我根本没有发现丢失的返回类型。非常感谢。
  • 感谢您通过编辑扩展原始答案,非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多