2

私はブロックを持っています:

typedef id (^completionBlock)(id data, NSURLResponse *urlResponse, NSError *error);

そして、クラスメソッドで、このブロックにコードを入力しようとします。

request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){
  ...
return object;
};

requestCompletedBlockは明らかにcompletionBlockタイプです。

次のエラーが発生します。

"'void *(^)(_ strong id、NSURLResponse * _strong、 NSError *から'completionBlock'(別名' id(^)(_ strong id、NSURLResponse * _strong、NSError * __ strong)')に割り当てる互換性のないブロックポインタタイプ__強い)'"

明らかに私の構文はどこかで間違っていますが、どこで?

どうもありがとう、

Vb

4

3 に答える 3

7

何らかの理由で、コンパイラは、インラインブロックの戻り型がであると推測してvoid*idます。次のようidにreturntypeを後に付けることにより、returntypeofを使用するように強制できます。^

request.requestCompletedBlock = ^id (id data, NSURLResponse *urlResponse, NSError *error) {
    //                           ~~
    //                        Return type
}

ブロック構文の詳細については、このページを参照してください。

于 2013-03-12T23:47:38.370 に答える
1

コンパイラは、「オブジェクト」のタイプに対して「void*」を推測しています。次のように、リテラルの戻り型を明示的に宣言できます。

^id(id data, ...) { ... }
于 2013-03-12T23:45:07.443 に答える
1

あなたの構文は正しいです、それはあなたが間違えたあなたのデータのタイプです。

あなたobjectはタイプvoid*ですが、あなたのブロックはあなたが戻ることを期待していますidobjectこれは、たとえば、NSData*にラップする必要があることを意味します

request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){
    ...
    return (id)[NSData dataWithBytes:object length:numBytes];
};

または、の宣言を変更してcompletionBlock、の戻り型を期待しvoid*ます。

于 2013-03-12T23:51:06.037 に答える