Я пишу класс, в котором вы регистрируете объект и свойство для наблюдения. Когда свойству присваивается значение, отличное от nil
, вызывается зарегистрированный селектор обратного вызова (например, target-action). Селектор может иметь три разных подписи, и правильная вызывается в зависимости от того, какой тип был зарегистрирован.
Это прекрасно работает, но теперь я хочу добавить возможность регистрации блока вместо селектора в качестве «функции обратного вызова». Можно ли узнать сигнатуру функции предоставленного блока и по-разному обрабатывать обратный вызов в зависимости от типа предоставленного блока?
Например:
- (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?
}
}
Любые идеи?
Я знаю, что могу создавать разные регистровые функции с конкретными аргументами typedef
ed Block, но я бы предпочел одну функцию, если это возможно.