NSArray se torna NSCFArray quando passado
-
10-07-2019 - |
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.
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:
-
NSArray
é um aglomerado de classe. Eu não sei o comportamento exato de-isMemberOfClass:
e-isKindOfClass:
em clusters. você pode verificar esta questão para mais precisões: é seguro usar isKindOfClass:? contra uma instância NSString para determinar o tipo -
Você já tentou
-isKindOfClass:
vez de-isMemberOfClass:
?
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;
}