как делиться константами (перечислениями) между классами?

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

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

Итак, я делаю BAD и есть способ, которым я могу определить перечисления в одном месте, так что мне не нужно поддерживать несколько битов кода, которые могут легко выйти из синхронизации?

РЕДАКТИРОВАТЬ. Хорошо, копайте немного больше ( здесь + здесь ). Я вижу, что я могу быть на правильном пути. Поэтому я думаю, мне нужно знать, что и где файл 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; } } 

Я не собираюсь говорить, что ваш подход – это плохо, но он слегка относится к стартовому эмбриону «божественного» метода, который является методом, который пытается сделать все. Однако для количества вариантов, которые у вас есть в коде, я бы сказал, что это прекрасно.

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

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

Кстати, я бы одевал enum чуть больше, как:

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

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

 int varName = kSetAllNotesOn; 

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

 SetEnumType varName = kSetAllNotesOn; 

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

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

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

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

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

 - (void)barPropertyAction:(int)action withParam:(NSNumber *)param { switch ((SetEnumType)action) { case kSetPlaybackType: playbackType = [param intValue]; 
  • Значение по умолчанию для Enum in Swift
  • Значения Swift enum недоступны
  • Как использовать ENUM в качестве параметра для метода
  • Где создавать и как использовать Enum в iOS?
  • swift: Enum constant с типом и значением
  • Interesting Posts

    Как заставить AVPlayer отображаться мгновенно, а не после окончания видео?

    Что мне делать после получения NSUbiquityIdentityDidChangeNotification?

    Установите высоту строки UITableView в соответствии с ячейкой в ​​этой строке

    Какой NSAssertion следует использовать внутри блока?

    Как отслеживать прогресс нескольких одновременных загрузок с помощью AFNetworking?

    Ошибка приложения при запуске из AppStore или TestFlight, но работает нормально

    Почему мой Xcode не смог проверить быстрый проект iOS

    Как изменить строковый файл Localizable приложения программно в swift?

    Приложение сбой при загрузке нескольких изображений с сервера с использованием AFNetworking

    Определяет ли UIViewController или UINavigationController размер его представления?

    заменяя self-> isa из-за устаревания Xcode 4.6

    Пользовательский подкласс UIView требует, чтобы awakeFromNIB вызывался дважды

    Эксклюзивный iOS UTI

    Кордова 2.9, 3.0 нет console.log

    Делегат CLLocationManager не называется

    Давайте будем гением компьютера.