Вопрос

У меня есть метод, который получает много различных типов объектов и решает, что с ними делать:

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

}

Здесь произойдет одна из четырех вещей:Смотрите, Используйте, Exit или NSArray.Первые три отправляются, чтобы стать NSArrays, последний уже является NSArray.

Теперь, когда я передаю NSArray сюда из другого места, вот так:

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

...пользовательское действие никогда не вызывается, потому что оно считывает MyAction как NSCFArray, а не как NSArray .Когда я пытаюсь [MyAction isMemberOfClass:[NSCFArray class]], он не распознает CF.Простой способ заставить это работать на данный момент - просто предположить, что все, что не является Look, Use или Exit, является NSArray (избавьтесь от последнего else if и просто оставьте его как else), но мне это кажется неаккуратным.

Кто-нибудь знает, как я могу с этим справиться?

Спасибо, -к.

Это было полезно?

Решение

Вы можете попробовать использовать isKindOfClass: вместо того , чтобы isMemberOfClass:.

Первый вернет YES для объектов, которые являются либо экземплярами отправляемого вами класса, либо его подклассами, как это может быть в случае NSCFArray.

Другие советы

Две возможности, которые стоит рассмотреть:

NSCFArray является подклассом массива NSMutable

Вы можете использовать isKindOfClass, чтобы проверить это

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;
} 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top