Объявите параметр ObjC, что класс, соответствующий протоколу
В Objective-C можно передать класс в качестве параметра методу:
- (void) methodThatTakesClass:(Class)theClass;
И можно передать экземпляр, соответствующий протоколу в качестве параметра:
- (void) myConformInstance:(id <MyProtocol>)theObject;
Можно ли использовать комбинированные функции? Метод, который принимает класс, который соответствует определенному протоколу.
Ответы
Ответ 1
Да. Ниже приведена допустимая программа, которая будет регистрировать класс NSObject.
#import <Foundation/Foundation.h>
void f(Class <NSObject> c) {
NSLog(@"%@",c);
}
int main() {
f([NSObject class]);
}
Это приведет к ошибке компилятора, если вы попытаетесь передать класс, который не соответствует NSObject, например класс Object
. Вы также можете использовать его для методов.
- (void)printClass:(Class <NSObject>)c;
Ответ 2
также действителен:
@interface Something: Object {
}
- (void) foo:(int(*)(void))bar;
@end
@implementation Something
- (void) foo:(int(*)(void))bar {
return (*bar)();
}
@end
int someFunc( void ) {
return 9;
}
int main ( int argc, char **argv ) {
Something *object = [[Something alloc] init];
printf( "%i\n", [object foo:&someFunc] );
[object release];
return 0;
}