2011-12-30 11 views
11

ブロックを引数として取るブロックを定義しようとしています。Objective Cの別のブロックに引数としてブロックを渡す方法

次のコード行で何が問題になっていますか?

id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^)(void)block) { 
    NSObject *item = nil; 
    block(); 
    return item; 
}; 

なぜコンパイラはParameter name omittedExpected ")"ようなエラーを与え続けるのでしょうか?

答えて

10
id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^block)(void)) { 
    NSObject *item = nil; 
    block(); 
    return item; 
}; 

ブロックには、関数ポインタと似た構文があります。後にブロック名を宣言する必要があります。

3

割り当てのRHSにはid(^block)(void)がありますか?

10

これはtypedefが発明された理由です。このように関数ポインタやブロック型を埋め込むのは苦痛です。これを代わりに試してみてください:

typedef id (^ InnerBlock)(void); 
typedef id (^ OuterBlock)(NSString *, InnerBlock); 

これは、読みやすいブロックタイプで動作します。 :)

+0

ああ、ポインタありがとう(意図しない言い訳)。私はブロックの定義が本当に読みにくいことが分かり、typedefは本当に完璧な解決策です!私の特定のエラーは、ブロック変数名をどこに置くべきか誤解されていました。 – Tony

関連する問題