Я пишу класс, в котором вы регистрируете объект и свойство для наблюдения. Когда для свойства устанавливается значение, отличное от 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 аргументами блока, но я бы предпочел, если возможно, иметь одну функцию.