我今天很快就玩了积木,我遇到了错误:
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之前?
答案 0 :(得分:14)
这不是最好的方法。
您应该更正第一行:
NSString *(^testBlock)(int) = ^NSString*(int option){
if(option == 1) return @"ONE";
if(option==2) return @"TWO";
return nil;
};
这样块块文字指定了返回类型,错误就消失了。正确。
编辑:添加有关初始错误的说明:
没有返回类型的块将具有编译器推断的返回类型(函数不会发生这种情况)。如果块中有2个不同类型的返回语句(请注意nil为void *),编译器无法推断返回类型并报告错误。 要修复该错误,您必须手动指定返回类型以避免编译器的歧义。
作为一种好的做法,除非使用多态,否则永远不要从同一个块返回不同的类型。