8

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

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?

4

1 回答 1

14

这不是最好的方法。

您应该将第一行更正为:

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

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

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

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

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

于 2013-01-10T13:29:25.250 回答