setByAddingObject не добавляет объект ... ворчать - PullRequest
0 голосов
/ 07 марта 2012

Так что моя проблема в основном в этом, я разбираю изменяемый массив чисел и строк, чтобы попытаться найти переменные.У меня есть частный вспомогательный метод, который отлично работает, и различает операции (@ "+", @ "-" и т. Д.) И переменные (@ "x", @ "y" и т. Д.).Проблема в том, что код в моем блоке else ниже не работает.Я получаю внутри оператора else просто отлично с @ "x" или @ "y", но NSSet, который я пытаюсь создать, не работает.Я просто держу NSLog (ging) "возвращаемые переменные пусты".Есть идеи?

+ (NSSet *)variablesUsedInProgram:(id)program
{

    NSMutableArray *stack;

    if([program isKindOfClass:[NSArray class]]){
        stack = [program mutableCopy];
    }

    NSSet *returnVariables = nil;

    for (int i=0; i<stack.count; i++) {
        if ([[stack objectAtIndex:i] isKindOfClass:[NSString class]]) {
            if ([self isOperation:[stack objectAtIndex:i]]) {
                continue;
            } else {
                returnVariables = [returnVariables setByAddingObject:[stack objectAtIndex:i]];
                if (returnVariables.count == 0) {
                    NSLog(@"returnVariables is empty");
                }
            }
        } 
    }

    return returnVariables;
}

1 Ответ

1 голос
/ 07 марта 2012

Это потому, что вы не инициализируете returnVariables. Измените эту строку:

NSSet *returnVariables = nil;

к этому:

NSSet *returnVariables = [NSSet set];

-[NSSet setByAddingObject:] - это метод экземпляра, то есть он должен вызываться для экземпляра NSSet. Он не предназначен для создания нового набора с нуля, скорее он берет существующий набор, к которому вы вызываете его, и создает новый набор, который является копией этого набора с добавленным к нему дополнительным объектом, и возвращает этот новый набор.

Еще лучше, используйте NSMutableSet:

NSMutableSet returnVariables = [NSMutableSet mutableSet];

// Inside your loop:
[returnVariables addObject:[stack objectAtIndex:i]];
...