Pergunta

Eu tenho um método que recebe muitos tipos diferentes de objetos e decide o que fazer com eles:

-(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];

}

Uma das quatro coisas vai vir por aqui: Olha, Use, Sair ou NSArray. Os três primeiros são enviados para se tornar NSArrays, a última já é um NSArray.

Agora, quando eu passar um NSArray aqui de outro lugar, como este:

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

... a ação personalizada nunca é chamado, porque ele lê myAction como um NSCFArray em vez de um NSArray. Quando tento [myAction isMemberOfClass: [classe NSCFArray]] que não reconhece o CF. A maneira simples de fazê-lo funcionar no momento é apenas supor que não qualquer um olhar, Uso ou Exit é um NSArray (se livrar da última else if, e apenas deixá-lo como uma outra coisa), mas que parece desleixado para mim .

Alguém sabe como posso lidar com isso?

Obrigado, k.

Foi útil?

Solução

Você pode tentar usar isKindOfClass: vez de isMemberOfClass:.

O primeiro vai retornar SIM para objetos que são ou instâncias da classe que você enviar, ou subclasses do mesmo, como pode ser o caso para NSCFArray.

Outras dicas

Duas possibilidades vale a pena considerar:

NS?FArray é subclasse de NSMutable array

Você pode usar isKindOfClass para verificá-lo

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;
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top