2015-12-15 1 views
1

У меня есть класс, как так:Определить класс объекта из идентификатора <protocol>

@interface Foo : NSObject <FooDataProvider> 
... 
@end 

и где-то вдоль линии в другом классе у меня есть метод, с помощью интерфейса:

-(void) doStuff:(id<FooDataProvider>)fooProvider{ 
... 
} 

И еще Где-то еще у меня есть

-(void) passMeClasses:(Class)theClass 
{ 
<do stuff based on the class> 
} 

Обычно я передать вещи в этот метод просто нравится

Foo* f = [[Foo alloc] init]; 
... 
[bar passMeClasses:[f class]]; 

Но я не уверен, как передать то, что я только иметь идентификатор .. как так

id<FooDataProvider> f = [[Foo alloc] init]; 
.... 
[bar passMeClasses:[f ?????]]; 

или в качестве альтернативы, как это сделать из метода DoStuff

-(void) doStuff:(id<FooDataProvider>)fooProvider{ 
    Class c = [fooProvider howDoIGetMyClass]; 
    bar passMeClasses:c]; 
} 

Может кто-то Помогите мне в определении класса из id?

Извините за длительное объяснение, но, надеюсь, его ясно!

+0

Обновите свой вопрос декларацией 'FooDataProvider'. – rmaddy

ответ

1

[f class]

class представляет собой метод. Он вызван на объект. Объект вернет свой класс (или он должен, он может технически вернуть что-то еще, а иногда и делать). Тип переменной совершенно неактуальен во время выполнения. Во время выполнения все указатели объектов - id. Вот почему method signature type encodings только обозначают «объект идет здесь». (См. @.) Они не могут выразить конкретный тип объекта.

+0

Спасибо, Роб, но это похоже на то, что я вижу. Просто вызов [f class] дает ошибку «неизвестный метод экземпляра для класса select». Я могу сначала передать его id, а затем сделать это, например: [(id) f class] – xceph

+2

@xceph Убедитесь, что ваш протокол 'FooDataProvider' расширяет протокол' NSObject'. – rmaddy

+0

@rmaddy Это проблема, спасибо! Если вы хотите добавить его в качестве истинного ответа, чтобы я мог его принять, пожалуйста, сделайте это. – xceph

Смежные вопросы