Короткий ответ - нет или, по крайней мере, не на этом уровне.
Длинный ответ заключается в том, что технически возможно создать что-то похожее на использование NSInvocations (и / или forwardInvocation:
), делать что-то умное в methodForSelector: и или динамически регистрировать реализации метода, но это очень сложно, особенно если Вы беспокоитесь о скорости.
Если бы у меня был какой-то код, в котором создание таких методов с карри было бы действительно полезным, я бы сделал что-то вроде этого (написано в этом комментарии, не проверено);
//FIXME: In a real implementation you would do some mangling, this code will get confused if you have _s in the curried selector, and thus could be exploitable
//This method makes a unique selector by mangling the arguments
- (SEL) selectorForSelector:(SEL)bindSel withString:(NSString *)bindString {
NSString *mangle = [NSString *stringWithFormat:@"LGBind_%@_%@"], NSStringFromSelector(bindSel), bindString];
SEL retval = NSSelectorFromString(mangle);
//Register the imp. You probably want to check if it is already reg
if (![self respondsToSelector:retval]) {
class_addMethod([self class], retval, LGBind_IMP, "v@:")l
}
}
//Generic dispatcher imp
void LGBind_IMP(id self, SEL _cmd) {
NSString *selectorName = NSStringFromSelector(_cmd);
NSArray *array [selectorName componentsSeparatedByString:@"_"];
//Skip index 0; it is @"LGBind"
NSString *originalSelectorString = [array objectAtIndex:1];
NSString *originalArgString = [array objectAtIndex:2];
//Get our the SEL and the IMP
SEL originalSEL = NSSelectorFromString(originalSelectorString);
IMP originalIMP = [self methodForSelector:originalSEL];
//call the original imp
originalIMP([self class], originalSEL, originalArgString);
}
Очевидно, что в зависимости от ваших конкретных потребностей вы могли бы делать что-то где-то по-другому, например, вы могли бы лениво работать с бесами в forwardInvocation или хранить данные об управляемом селекторе в dict в экземпляре, вместо того, чтобы просто перенести его в имя селектора.