как разделить константы (перечисления) между классами? - PullRequest
5 голосов
/ 29 февраля 2012

У меня есть некоторые UIPopoverViewControllers, которые отправляют сообщения для делегирования UIViewControllers для передачи событий пользовательского интерфейса. Вместо написания отдельного метода для каждого события у меня есть метод в делегате с оператором switch, который определяет, как обрабатывать событие на основе переданной константы (пример ниже).

Это, вероятно, плохой дизайн, но это то, что я придумал. Я видел этот вопрос относительно перечислений или статических классов, но не понял ответов.

Так что ... это то, что я делаю ПЛОХО и есть ли способ, которым я могу определить перечисления в одном месте, чтобы мне не пришлось поддерживать несколько битов кода, которые могут легко выйти из синхронизировать

РЕДАКТИРОВАТЬ Хорошо, копаться еще немного ( здесь + здесь ) Я вижу, что могу оказаться на правильном пути. Так что, думаю, мне нужно знать, что и где находится файл implementation в iOS.

enum {
kSetPlaybackType = 0,
kSetAllNotesOn,
kSetAllNotesOff,
kSetVelocity,
kSetDuration
};

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param
{
switch (action) {
    case kSetPlaybackType:
        playbackType = [param intValue];
        if (playbackType == kPalindrome){
            palindromeDirection = kPalindromeUp;
        }
        break;

    case kSetAllNotesOn:
        for (BarNote* note in self.barNoteArray) {
            note.noteOn = YES;
        }
        [self.bar updateWindows];
        break;

    case kSetAllNotesOff:
        for (BarNote* note in self.barNoteArray) {
            note.noteOn = NO;
        }
        [self.bar updateWindows];
        break;

    case kSetVelocity:
         for (BarNote* note in self.barNoteArray) {
            note.velocity = [param intValue];
        }
        break;

    case kSetDuration:
        for (BarNote* note in self.barNoteArray) {
            note.duration = [param floatValue];
        }
        break;

    default:
        break;
}
}

1 Ответ

15 голосов
/ 29 февраля 2012

Я не собираюсь говорить, что ваш подход настолько плох, но он слегка ощущает начальный зародыш "божьего" метода - метода, который пытается сделать все. Тем не менее, для количества вариантов, которые вы имеете в коде, я бы сказал, что это прекрасно.

Но разделить перечисление вокруг очень легко. Просто поместите их в свой собственный файл .h и импортируйте его туда, где это необходимо. Вы можете включить файл .h в качестве одного из типов файлов в разделе «C & C ++».

Вопрос, на который вы ссылались, был на C #, и одна вещь, которую они делали на этом языке, заключалась в том, чтобы спроектировать эквивалент файлов .h и просто использовать операторы «using» для поиска правильных символов. В Objective-C (как в C и C ++) вам нужно проделать немного больше ручной работы, чтобы достичь того же.

Кстати, я бы нарядил перечисление чуть больше как:

typedef enum {
  kSetPlaybackType = 0,
  kSetAllNotesOn,
  kSetAllNotesOff,
  kSetVelocity,
  kSetDuration
} SetEnumType;

Объявляя enum в typedef, вы получаете возможность объявлять переменные этого типа. Т.е. вместо:

int varName = kSetAllNotesOn;

Вы можете сказать:

SetEnumType varName = kSetAllNotesOn;

Это дает дополнительные подсказки XCode при представлении вам вариантов автозаполнения и делает семантически более удобными для чтения как личность, поскольку вы знаете, что varName предназначен для хранения перечисления, а не просто любого старого числа.

Недостатком является то, что вам может потребоваться явное приведение varNum между типом enum и типом int в зависимости от того, что вы делаете.

Однако я не уверен, что вы можете объявить подпись вашего метода как

- (void)barPropertyAction:(SetEnumType)action withParam:(NSNumber *)param

Полагаю, вы должны это сделать (так как я думаю, что перечисление поддерживается int). Но если вы не можете, то вам лучше всего сделать

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param
{
switch ((SetEnumType)action) {
    case kSetPlaybackType:
        playbackType = [param intValue];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...