NSArray diventa NSCFArray quando passato
-
10-07-2019 - |
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.
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:
NSArray
è un cluster di classi. Non conosco il comportamento esatto di-isMemberOfClass:
e-isKindOfClass:
sui cluster. puoi controllare questa domanda per ulteriori precisazioni: È sicuro usare isKindOfClass: contro un'istanza di NSString per determinare il tipo?-
Hai provato
-isKindOfClass:
invece di-isMemberOfClass:
?
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;
}