2010-07-25 5 views
2

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

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

Whew!

Проблема в том, что, хотя я знаю, что добираюсь до цикла 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]; 
    } 
} 

ответ

5

счетчик цикла Initialize I

for (int i = 0; i<[selectedChemicalGroup count]; i++) 
2

Выполните следующие действия, и вы поймете, почему:

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

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

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

for (MyChemicalGroupClass *group in selectedChemicalGroup) { 
    if ([selectedConcentration isEqualToString:[group chemConcentration]]) { 
    ... 
    } 
} 
+0

+ для быстрого перечисления – Vladimir

Смежные вопросы