Объявите параметр ObjC, который является классом, соответствующим протоколу - PullRequest
21 голосов
/ 03 августа 2011

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

- (void) methodThatTakesClass:(Class)theClass;

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

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

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

Ответы [ 2 ]

13 голосов
/ 03 августа 2011

Да.Ниже приведена допустимая программа, которая будет регистрировать класс NSObject.

#import <Foundation/Foundation.h>
void f(Class <NSObject> c) {
    NSLog(@"%@",c);
}
int main() {
    f([NSObject class]);
}

Это может вызвать ошибку компилятора, если вы попытаетесь передать класс, который не соответствует NSObject, например класс Object,Вы также можете использовать его для методов.

- (void)printClass:(Class <NSObject>)c;
0 голосов
/ 03 августа 2011

также действует:

@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; 
}
...