Подтвердить что ты не робот

Объявите параметр ObjC, что класс, соответствующий протоколу

В Objective-C можно передать класс в качестве параметра методу:

- (void) methodThatTakesClass:(Class)theClass;

И можно передать экземпляр, соответствующий протоколу в качестве параметра:

- (void) myConformInstance:(id <MyProtocol>)theObject;

Можно ли использовать комбинированные функции? Метод, который принимает класс, который соответствует определенному протоколу.

4b9b3361

Ответ 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; 
}