オブジェクトと観察するプロパティを登録するクラスを書いています。プロパティが 以外のものに設定されるとnil
、登録されたコールバック セレクターが呼び出されます (target-action など)。セレクターには 3 つの異なるシグネチャーがあり、登録された型に応じて適切なシグネチャーが呼び出されます。
これは問題なく動作しますが、「コールバック関数」としてセレクターの代わりにブロックを登録する機能を追加したいと考えています。提供されたブロックの関数シグネチャを見つけて、提供されたブロックのタイプに応じて異なる方法でコールバックを処理することは可能ですか?
例えば:
- (void)registerCallbackBlock:(id)block
{
if ([self isBlock:block] {
if ([self isMethodSignatureOne:block]) { /* */ }
else if ([self isMethodSignatureTwo:block]) { /* */ }
else { assert(false); } // bad Block signature
block_ = block; // assuming ARC code
}
else { assert(false); } // not a block
}
- (void)callBlock
{
if ([self isMethodSignatureOne:block_] {
block_(arg1_, arg2_); // needs casting?
}
else if ([self isMethodSignatureTwo:block_) {
block_(arg1_, arg2_, arg3_); // needs casting?
}
}
何か案は?
特定の 'ed Block 引数を使用してさまざまなレジスタ関数を作成できることはわかっていtypedef
ますが、可能であれば単一の関数を使用したいと考えています。