fuz*_*oat 8 iphone cocoa-touch objective-c objective-c-blocks
今天我只是快速玩积木,我遇到了错误:
NSString *(^testBlock)(int) = ^(int option) {
if (option == 1) return @"ONE";
if (option == 2) return @"TWO";
return nil;
};
NSLog(@"OUTPUT: %@", testBlock(4));
Run Code Online (Sandbox Code Playgroud)
Return type 'void *' must match previous return type 'NSString *' when block literal has unspecified explicit return type
Run Code Online (Sandbox Code Playgroud)
因为我真的想要返回nil,如果没有输入"1"或"2",我决定简单地使用以下命令将最终返回值转换回NSString:
NSString *(^testBlock)(int) = ^(int option) {
if (option == 1) return @"ONE";
if (option == 2) return @"TWO";
return (NSString *) nil;
};
Run Code Online (Sandbox Code Playgroud)
这很好用,我只是好奇,如果这是正确的解决方案,甚至是不好的练习,因为我从来没有考虑过铸造零呢?
sqr*_*ept 14
这不是最好的方法.
你应该纠正第一行:
NSString *(^testBlock)(int) = ^NSString*(int option){
if(option == 1) return @"ONE";
if(option==2) return @"TWO";
return nil;
};
Run Code Online (Sandbox Code Playgroud)
这样块块文字具有指定的返回类型,并且错误消失.正确.
编辑:添加关于初始错误的说明:
没有返回类型的块将具有编译器推断的返回类型(函数不会发生这种情况).如果块中有2个不同类型的返回语句(请注意nil为void*),编译器无法推断返回类型并报告错误.要修复该错误,您必须手动指定返回类型以避免编译器的歧义.
作为一种好的做法,除非使用多态,否则永远不要从同一个块返回不同的类型.
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |