Domanda

Ho un metodo che riceve molti tipi diversi di oggetti e decide cosa farne:

-(void)performAction:(NSObject *)myAction withItem:(Item *)myItem {

actionCount = -1;
NSLog(@"-- NEW ACTION ARRAY --");
if ([myAction isMemberOfClass:[Look class]]) {
    currentActionArray = [self createLookArray:(Look *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Use class]]) {
    currentActionArray = [self createUseArray:(Use *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Exit class]]) {
    currentActionArray = [self createExitArray:(Exit *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[NSArray class]] ) {
    NSLog(@"--- CUSTOM ACTION --- %@", myAction);
    currentActionArray = (NSArray *)myAction;
} 
[self performNextAction];

}

Una delle quattro cose sta per succedere qui: Guarda, Usa, Esci o NSArray. I primi tre vengono espulsi per diventare NSArray, l'ultimo è già un NSArray.

Ora, quando passo un NSArray qui da altrove, in questo modo:

    NSArray *myAction = [[NSArray alloc] initWithObjects:myAction1, myAction2, nil];
[controller performAction:myAction withItem:nil];

... l'azione personalizzata non viene mai chiamata, perché legge myAction come NSCFArray anziché come NSArray. Quando provo [myAction isMemberOfClass: [NSCFArray class]] non riconosce il CF. Il modo semplice per farlo funzionare al momento è solo supporre che qualcosa di diverso da Look, Use o Exit sia un NSArray (sbarazzarsi dell'ultimo se, e lasciarlo come un altro), ma questo mi sembra sciatto .

Qualcuno sa come posso gestirlo?

Grazie, -k.

È stato utile?

Soluzione

Puoi provare a usare isKindOfClass: invece di isMemberOfClass: .

Il primo restituirà SÌ per gli oggetti che sono o istanze della classe inviata o sottoclassi di essa, come potrebbe essere il caso di NSCFArray .

Altri suggerimenti

Due possibilità da considerare:

NS n # 1057; FArray è una sottoclasse di NSMutableArray

Puoi usare isKindOfClass per controllarlo

if ([myAction isMemberOfClass:[Look class]]) {
    currentActionArray = [self createLookArray:(Look *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Use class]]) {
        currentActionArray = [self createUseArray:(Use *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Exit class]]) {
        currentActionArray = [self createExitArray:(Exit *)myAction item:myItem];
} else if ([myAction isKindOfClass:[NSArray class]] ) {
        NSLog(@"--- CUSTOM ACTION --- %@", myAction);
        currentActionArray = (NSArray *)myAction;
} 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top