2012-06-01 2 views
0

Как ссылаться на класс (а не на экземпляр этого объекта!), Который реализует конкретный протокол?Цель Ссылка на класс, реализующий протокол

+(id<Data>) dataForName:(NSString *)name { 
    id<DataManager> manager = SpecializedDataManager; // <-- which datatype does "manager" have to be? 
    return [[manager sharedManager] get:name]; //Getting data over a singleton of manager 
} 

Где Data и DataManger являются протоколами и SpecializedDataManager является классом реализации протокола DataManager.

ответ

0

Я не пробовал это сам, но вы должны быть в состоянии использовать указатель на класс, хотя я сомневаюсь, что вы могли бы указать, что класс должен реализовывать определенный протокол:

static Class manager = NULL; 

+ (void)someInitMethod 
{ 
    manager = [SpecializedDataManager class]; 
    NSAssert([manager conformsToProtocol:@protocol(DataManager)], @"Achtung!"); 
} 
+0

Код, показанный на моем первом посте, упрощен, чтобы показать проблему менее сложным образом. Переменная «manager» на самом деле используется во многих местах моего кода. Поэтому я должен найти способ указать класс один раз и использовать его в качестве заполнителя. – gorootde

+0

@k_wave: Хорошо, я обновил свой ответ с массивной догадкой о том, как идти ... – trojanfoe

0

Если я понял, вы правильно, вы хотите, чтобы написать что-то вроде этого:

id<SomeProtocol> someObject = AnotherObjectConformingThisProtocol;  
Class class = [(NSObject*)SomeObject class]; 

if ([someObject isKindOfClass:[AnotherObjectConformingThisProtocol class]]) {} 
if (class == [AnotherObjectConformingSomeProtocol class]) {} 

Если нет - просьба уточнить, что именно вы имеете в виду.

UPDATE: Я прочитал ваш комментарий рядом с другим постом и получил его:

Создания классов-оболочек для вашего DataManager и протоколы данных:

@interface DataClass : NSObject <Data> 
@end 

@interface DataManagerClass : NSObject <DataManager> 
@end 

И использовать такой код:

+(DataClass*) dataForName:(NSString *)name { 
    DataManagerClass* manager = SpecializedDataManager; // <-- which datatype does "manager" have to be? 
    return [[manager sharedManager] get:name]; //Getting data over a singleton of manager 
} 
0

Это то, что вы ищете:

+(id<Data>) dataForName:(NSString *)name { 
    Class<DataManager> manager = [SpecializedDataManager class]; 
    return [[manager sharedManager] get:name]; 
} 
Смежные вопросы