Obiectiv C referință la clasa de punere în aplicare a unui protocol

Cum se face referire la o clasă (nu o instanță a acesteia!) Care implementează un protocol specific?

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

Unde date și DataManger sunt protocoale și SpecializedDataManager este o clasă care implementează protocolul DataManager .

0

3 răspunsuri

Este ceea ce căutați:

+(id) dataForName:(NSString *)name {
    Class manager = [SpecializedDataManager class];
    return [[manager sharedManager] get:name];
}
0
adăugat

Nu am încercat singur asta, dar tu ar trebui să poți utiliza un cursor la clasă, deși mă îndoiesc că ai putea specifica că clasa trebuie să implementeze un anumit protocol:

static Class manager = NULL;

+ (void)someInitMethod
{
    manager = [SpecializedDataManager class];
    NSAssert([manager conformsToProtocol:@protocol(DataManager)], @"Achtung!"); 
}
0
adăugat
Codul afișat în primul meu post este simplificat pentru a arăta problema într-o manieră mai puțin complexă. Variabila "manager" este folosită de multe ori în codul meu. Așadar, trebuie să găsesc o modalitate de a specifica clasa o singură dată și de ao folosi ca înlocuitor.
adăugat autor gorootde, sursa
@k_wave: OK, mi-am actualizat răspunsul cu o estimare masivă pe drumul spre care ...
adăugat autor trojanfoe, sursa

Dacă te-am înțeles corect, vrei să scrii ceva de genul ăsta:

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

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

Dacă nu - clarificați exact ce vreți să spuneți.

UPDATE: Am citit comentariul dvs. lângă o altă postare și l-am obținut:

Creați clase de împachetare pentru protocoalele DataManager și Data:

@interface DataClass : NSObject 
@end

@interface DataManagerClass : NSObject 
@end

Utilizați codul de mai jos:

+(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
adăugat