Классы стиля Java-enum в Objective-C? - PullRequest
13 голосов
/ 10 июня 2009

Я новичок в Obj-C, так что простите, если это глупый вопрос:

Как мне реализовать некоторые из них в стиле Javas enums? Или, если быть более точным:

Мне нужен класс с некоторыми известными свойствами, которые исправляются во время компиляции и уникальны для каждого экземпляра. Кроме того, я хочу только один тип экземпляра.

Позвольте мне привести пример на Java:

public enum MessageTypes {
  DEFAULT("white", "standard", 1),
  EXPRESS("red", "expressMessage", 2),
  BORADCAST("green", "broadcast", 3);

  String color; String tagName; int dbId;
  MessageTypes(String color, String tagName, int dbId) {
    // you get the idea
  }
  //some methonds like getEnumByTagName
}

Как бы вы сделали что-то подобное в Objective-C? Я что-то пропустил? Это вообще плохая картина?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Я извиняюсь, если я не прояснил себя. Я знаю, что перечисления obj-c - это не то, что я ищу (так как они лишь немного больше, чем typedef для int).

Я хотел бы создать набор (одноэлементных, неизменяемых) экземпляров определенного класса. Шаблон Singleton в Apples Dev-Docs бесполезен, так как мне нужно несколько отдельных экземпляров класса, каждый из которых имеет отдельные значения в своих свойствах.

Цель этого состоит в том, чтобы иметь несколько типов сообщений (около 20), которые можно назначить сообщению в качестве свойства. Каждый из моих типов сообщений имеет (фиксированный и предопределенный) цвет, значение атрибута (в XML-представлении) и числовой идентификатор.

В Java я использовал бы enum, как в моем примере кода. Но как мне создать разные типы сообщений и связать их с их свойствами в Obj-C?

Создание 20 подклассов типа MessageType (каждый с экземпляром-одиночкой, содержащим свойства) кажется большой работой для такой простой задачи и полного перерасхода.

Мой текущий подход заключается в создании класса с NSArray, содержащим разные экземпляры. При первом доступе к методу, подобному +(id)messageTypeForId:NSInteger id_, NSArray предварительно заполнен. Но это кажется совершенно неуклюжим и совсем не элегантным ...

Есть ли более удовлетворительный подход?

Ответы [ 4 ]

7 голосов
/ 11 июня 2009

На пути к «более удовлетворительному подходу» не так уж много.

Обычным шаблоном Какао было бы создание таких методов, как:

+ (MessageTypes*) sharedDefaultMessageType;
+ (MessageTypes*) sharedExpressMessageType;
+ (MessageTypes*) sharedBroadcastMessageType;
etc

, а затем реализовать их что-то вроде:

+ (MessageTypes*) sharedDefaultMessageType
{
   static MessageTypes* thisMessageType = nil;
   if ( !thisMessageType ) {
      thisMessageType = [[MessageTypes alloc] initWithColor:@"white" tagName:@"standard" dbId:1];
   }
   return thisMessageType;
}

В качестве альтернативы, хранение общего MessageType * в NSMutableArray или NSMutableDictionary или предварительный расчет их в процессе работы - одинаково допустимые подтверждения.

Обратите внимание, что указанный выше метод "template" может быть сгенерирован с помощью макроса, который можно записать в файл .m:

CREATEMESSAGETYPE( Default, @"white", @"standard", 1 )
CREATEMESSAGETYPE( Express, @"red", @"expressMessage", 2 )
CREATEMESSAGETYPE( Broadcast, @"green", @"broadcast", 3 )

что может быть "более удовлетворительным" или более безобразным, в зависимости от вашей точки зрения.

1 голос
/ 10 июня 2009

Думаю, я бы просто использовал стандартный перечисление C:

typedef enum { MT_WHITE, MT_RED, MT_GREEN } MessageType;

Тогда вы просто используете его как любой другой тип данных:

@interface Blah {}

-(void) setMessageType:(MessageType)newMessageType;

@end
0 голосов
/ 20 января 2010

У меня был тот же вопрос более или менее, но все вышеперечисленные решения были стилистически неуклюжими. В частности, при простом использовании свойства enum C для объекта вы теряете одноэлементную семантику перечислений Java. Самая большая свобода, которую я нашел в использовании перечислений Java, заключается в том, что экземпляры перечисления действительно являются одноэлементными подклассами и поэтому участвуют в полиморфизме методов. Еще более мощными, чем перечисления с уникальными атрибутами, являются перечисления с полиморфным поведением.

Учитывая, что это ключевая особенность, которая мне нужна, будет ли кластер класса Objective-C с одноэлементными частными подклассами подходом с желаемым поведением, несмотря на то, что стоимость и сложность реализации несколько превышают?

0 голосов
/ 10 июня 2009

Перечисления не являются объектами в C и, следовательно, не в Objective-C. Это просто пользовательские скаляры, которые имеют ограниченный набор именованных значений, которые они могут принимать. Вы можете дать объекту свойства перечислимого типа, которые, я думаю, наиболее близки к тому, что вы ищете.

Если вам нужно выполнить что-то конкретное с помощью этой функции, вы можете отредактировать свое сообщение, чтобы указать, что это такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...