Почему не выполняется цикл for? - PullRequest
2 голосов
/ 26 июля 2010

У меня есть контроллер вида для выбора химического источника и, возможно, концентрации. Если источник не имеет концентраций, он просто представляет один сборщик. Он заполняется NSDictionary с именами типов источников как keys и созданным мной объектом пользовательской модели под названием Chemical, который имеет четыре свойства: два NSString, одно float и одно BOOL.

Когда я запускаю это со словарем, который имеет 2 компонента, я хочу извлечь четыре значения из представленного Chemical. Обратите внимание, что я заполняю средство выбора значениями из первых двух свойств, но не float или BOOL. Я запускаю массив для ключа, выбранного в первом компоненте, и проверяю строку из второго компонента по свойству chemConcentration каждого из Chemical s в массиве ключ / значение. Когда chemConcentration совпадает, я знаю, что имею право Chemical, и я могу получить его свойства для отправки обратно.

Уф!

Проблема в том, что, хотя я знаю, что попал в цикл for, похоже, что он пропущен. NSLog прямо перед печатью, а внутри - нет. sourceConstant и sourceIsLiquid остаются 0.0 и NO

- (IBAction)selectedSourceButton {
    NSLog(@"selectedSourceButton pressed");
    NSInteger sourceRow = [picker selectedRowInComponent:kSourceComponent];
    NSString *selectedSource = [self.sources objectAtIndex:sourceRow];
    NSArray *selectedChemicalGroup = [dictionaryOfSources objectForKey:selectedSource];
    NSInteger concentrationRow = [picker selectedRowInComponent:kConcentrationComponent];
    NSString *selectedConcentration = [[NSString alloc] init];
    float selectedConstant = 0.0;
    BOOL selectedIsLiquid = NO;

    if (numberOfComponents == 2) {
        NSLog(@"numberOfComponents = 2 if/then chosen"); // <-- This prints.
        selectedConcentration = [self.concentrations objectAtIndex:concentrationRow];
        NSLog(@"begin selectedConcentration for loop.  Number of loops = %d", [selectedChemicalGroup count]); // <-- And so does this.
        for (int i; i<[selectedChemicalGroup count]; i++) { // <-- But this doesn't seem to fire!
            NSLog(@"selectedConcentration = %@, from selectedChemicalGroup = %@", selectedConcentration, [[selectedChemicalGroup objectAtIndex:i] chemConcentration]); // <-- Because this doesn't print.
            if ([selectedConcentration isEqualToString:[[selectedChemicalGroup objectAtIndex:i] chemConcentration]]) {
            selectedConstant = [[selectedChemicalGroup objectAtIndex:i] chemConstant];
            selectedIsLiquid = [[selectedChemicalGroup objectAtIndex:i] chemIsLiquid];
            }
        }
    }
    else {
        selectedConcentration = @"";
        selectedConstant = [[selectedChemicalGroup objectAtIndex:0] chemConstant];
        selectedIsLiquid = [[selectedChemicalGroup objectAtIndex:0] chemIsLiquid];
    }
    NSLog(@"selectedSourceButton source to return = %@, concentration = %@, sourceConstant = %1.7f, isLiquid = %d", selectedSource, selectedConcentration, selectedConstant, selectedIsLiquid);
    if ([self.delegate respondsToSelector:@selector (sourcePickerViewController:didSelectSource:andConcentration:andConstant:andIsLiquid:)]) {
        [self.delegate sourcePickerViewController:self didSelectSource:selectedSource andConcentration:selectedConcentration andConstant:selectedConstant andIsLiquid:selectedIsLiquid];
    }
}

Ответы [ 3 ]

6 голосов
/ 26 июля 2010

Вам нужно инициализировать вашу переменную i: for (int i = 0; ...

Но есть лучший способ сделать это, используя "быстрое перечисление":

for (MyChemicalGroupClass *group in selectedChemicalGroup) {
    if ([selectedConcentration isEqualToString:[group chemConcentration]]) {
    ...
    }
}
5 голосов
/ 26 июля 2010

Инициализировать счетчик циклов i

for (int i = 0; i<[selectedChemicalGroup count]; i++)
2 голосов
/ 26 июля 2010

Сделайте следующее, и вы поймете, почему:

int i;
NSLog(@"%d", i);
...