0

私はObjective-cに非常に慣れていないので、ブロックをもう少しよく理解しようとしています。私自身の仕事として、さまざまな方法でfizz-buzzを書こうとしています。

現在ブロックを使用していますが、まだ取得していない構文の問題が発生しました。

次の機能しない関数では、intを渡して、NSStringの型を返します。

NSString (^whichMessage)(int) = ^(int num) {
    return @"Test";
};

ただし、次のようなエラーが発生します。

Incompatible block pointer types initializing 'NSString (^_strong)(int)' with an expression of type 'NSString *(^)(int)'

誰かが私のサンプルコードの問題が何であるか、そしてまた適切な形式が何であるかを説明できますか?

私はここのドキュメントに従っています:http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1

(わかりやすくするために、リンク先のページのサンプルコードを次に示します)

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};

ページ上部の図を見て、ブロックタイプをNSStringに変更し、リターンタイプもNSStringに変更することで、機能すると思いました。しかし、残念ながら、そうではありません。

4

3 に答える 3

8

非常に簡単です。ブロックは、実際の文字列ではなく文字列へのポインタを返します。私たちは常に、実際のオブジェクト自体ではなく、オブジェクトへのポインタを操作します

         |
         v
NSString *(^whichMessage)(int) = ^(int num) {
    return @"Test";
};
于 2012-07-19T09:00:02.800 に答える
3

あなたは*を忘れました:

NSString* (^whichMessage)(int) = ^(int num) {
    return @"Test";
};

Objective-Cは、ポインタによって参照されるヒープベースのオブジェクトのみを使用します。C ++のように、スタックベースのObjective-Cオブジェクトを宣言することはできません。

このルールの注目すべき例外はブロックです。これはObjective-Cオブジェクトとして機能し、スタックベースにすることができます。

于 2012-07-19T09:00:33.620 に答える
1

あなたは星を忘れます*

NSString* (^whichMessage)(int) = ^(int num) {
    return @"Test";
};
于 2012-07-19T09:00:15.913 に答える