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つのreturnステートメントがブロックにある場合(nilはvoid *であることに注意してください)、コンパイラーはreturnタイプを推測できず、エラーを報告します。このエラーを修正するには、コンパイラーのあいまいさを回避するために、戻りタイプを手動で指定する必要があります。

良い習慣として、ポリモーフィズムを使用している場合を除いて、同じブロックから異なるタイプを返さないでください。

于 2013-01-10T13:29:25.250 に答える