在块中施放零

时间:2013-01-10 13:23:43

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

我今天很快就玩了积木,我遇到了错误:

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投射到nil之前?

1 个答案:

答案 0 :(得分:14)

这不是最好的方法。

您应该更正第一行:

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

这样块块文字指定了返回类型,错误就消失了。正确。

编辑:添加有关初始错误的说明:

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

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