Я не собираюсь говорить, что ваш подход настолько плох, но он слегка ощущает начальный зародыш "божьего" метода - метода, который пытается сделать все. Тем не менее, для количества вариантов, которые вы имеете в коде, я бы сказал, что это прекрасно.
Но разделить перечисление вокруг очень легко. Просто поместите их в свой собственный файл .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];