1. Objective C / Говнокод #8109

    −105

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    for (NSString *str in ar)
    {
    	if ([startChord isEqualToString:str])
    	{
    		if (offset > 0) 
    		{
    			if (i+offset > 11) // 11 - последний индекс в массиве
    				finalChord = [ar objectAtIndex:(i+offset) - 12];// (12 = 11+1) это чтобы понятно было, например, 11 элемент сместить на 2 выше, это будет 11+2 - 12 равно 1 индекс в массиве (т.е. второй элемент)
    			else
    				finalChord = [ar objectAtIndex:(i+offset)];
    		}
    		else if (offset < 0)
    		{
    			if (i-abs(offset) < 0) // 0 - первый индекс в массиве
    				finalChord =[ar objectAtIndex:12 - abs(i-abs(offset))];
    			else
    				finalChord = [ar objectAtIndex:(i-abs(offset))];
    		}
    		else
    		{
    			finalChord = [ar objectAtIndex:i];
    		}
    		break;
    	}
    	i++;
    }

    Но человек старался, да...

    Запостил: krypt, 07 Октября 2011

    Комментарии (5) RSS

    • и? что не так?
      Ответить
      • int i = [ar indexOfObject:startChord];
        finalChord = [ar objectAtIndex:(i + offset + 12) % 12];

        делает то же самое
        Ответить
        • Не всегда, следует понимать, что
          [ar indexOfObject:startChord];
          и
          [startChord isEqualToString:str]
          Это разные вещи. Конечно если не рассматривается ситуация, по которой startChord - это ссылка на элемент массива
          Ответить
          • В данном случае ar - это массив из 12ти строк (гитарные аккорды), startChord - тоже строка.

            NSArray *ar = [[NSArray alloc] initWithObjects:@"A", @"A#", @"B", @"C", @"C#", @"D", @"D#", @"E", @"F", @"F#", @"G", @"G#", nil];

            Так что результат для isEqual и isEqualToString будет одинаков, пожалуй только 2й побыстрее наботать будет. Но не на столько, чтобы экономить на 12ти сравнениях...

            Собственно я даже не знаю, корректен ли этот код с точки зрения логики изначально - я на гитаре играть не пробовал даже.

            Собственно, это код транспанирования.
            Ответить
    • int i = 0 в самом начале потерялось, но уже не поправить
      Ответить

    Добавить комментарий