Я делаю одно и то же заявление в разных местах. Как я могу сделать это более эффективным? - PullRequest
0 голосов
/ 02 февраля 2011

В моем приложении он узнает день недели в разных местах и ​​выполняет различные задачи. Например:

if ([weekDayString isEqualToString:@"Monday"]) {

mondayAlarm = @"ON";

}

else if ([weekDayString isEqualToString:@"Tuesday"]) {

tuesdayAlarm = @"ON";

}

и т.д.

И в разных местах в моем коде он делает один и тот же набор из 7 операторов if с разными выходами. Поэтому у меня есть 2 вопроса о том, как сделать его менее повторяющимся.

  1. Есть ли способ, которым я мог бы свести это до 7 выражений if, не повторяя каждый из них для каждой области, где я хочу, чтобы что-то произошло?
  2. Вы заметите, что все мои переменные, относящиеся к дню недели, содержат в себе день недели. Есть ли способ, которым я мог бы сделать это умнее, чем повторить более или менее один и тот же код 7 раз?

Помощь очень ценится.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 02 февраля 2011

Вслед за Якуру и запросом более подробной информации:

typedef enum Days { SUN, MON, TUE, WED, THUR, FRI, SAT, NUMBER_OF_DAYS } Days;

@interface MyClassWithAlarms
{
   Bool alarms[NUMBER_OF_DAYS];
}

- (void) setAlarmOnDay:(Days)day;

@end

@implementation MyClassWithAlarms

- (void) setAlarmOnDay:(Days)day
{
   alarms[day] = YES;
}

@end

и т.д.

Вы можете свободно смешивать C и Objective-C. Для массива всего из 7 логических значений нет смысла использовать NSArray, массив C будет намного быстрее и будет использовать меньше памяти. Вы не получите проверку границ, поэтому убедитесь, что ваш индекс всегда находится в диапазоне - что будет, если вы используете только Days значения.

2 голосов
/ 02 февраля 2011

Вы можете использовать перечисление вместо строки для текущего дня, тогда вместо набора переменных дня недели вы можете получить массив размером NUM_WEEKDAYS Тогда ваш код будет больше похож на:

Alarms[weekDay] = ON;

Еще несколько подробностей, поскольку это довольно C-like: Сначала перечисление связывает целые числа со значениями. Итак, вот примерное перечисление:

<code>enum Days
{
    MON,
    TUES,
    WEDS,
    THURS,
    FRI,
    SAT,
    SUN,
    NUM_WEEKDAYS
};
Таким образом, массив содержит каждое значение в последовательности, вместо того, чтобы:
<code>MonAlarm
TuesAlarm
WedsAlarm
...

Вы бы просто получили Alarms[NUM_WEEKDAYS]. Тогда вы можете получить доступ к будильнику понедельника через Alarms[MON] Так же, как вы привыкли обращаться к mondayAlarm.

Другой проблемой является то, что вы обращаетесь к своим дням недели через строку, этого следует избегать - строковые операции выполняются как SLOOOOOOOOOOOOOOOOOOOOOWOW. Вместо этого используйте перечисление, если это возможно. Откуда вы тянете эту строку? Дайте мне некоторые детали, и я покажу вам, как это исправить. Как только вы дойдете до точки, в качестве входного значения используется значение перечисления «MON», вы просто передаете его без необходимости использования if.

1 голос
/ 02 февраля 2011

Я бы порекомендовал вместо использования строки в исходной структуре данных использовать целочисленное или перечислимое значение. Более эффективно работать с целыми числами (или перечислениями), чем со строками. Преобразуйте целочисленное значение в строку только тогда, когда вам нужно его отобразить.

Любая специфичная для дня недели обработка может выполняться в операторе switch, а не в цепочке операторов if-else, выполняющих сравнения строк.

Этот подход также упрощает локализацию, если вы решите использовать свое приложение в стране, не говорящей по-английски.

Я бы рекомендовал использовать то же соглашение о дне недели, которое используется NSDateComponents.

0 голосов
/ 02 февраля 2011

Используем NSDictionary для хранения значений Alarm, получающих доступ к значениям с днями в качестве ключа.См. документы коллекций Apple Это не точный код, так как вы не даете достаточно контекста, но ..

// create
NSMutableDictionary* alarms = [NSMutableDictionary dictionary];
// set up the days
[alarms setObject:@"ON" forKey:@"Monday"];   // etc.

После всех установленных дат можно просто получить значение с

[alarms valueForKey:@"Monday"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...