Создание константы в target-c, которая называется свойством класса? (например, classA.KEY_FOR_ITEM1)
Как можно создать константу в target-c, которая называется свойством класса? (например, classA.KEY_FOR_ITEM1)
То есть я вижу совет относительно того, как создать константу здесь http://stackru.com/questions/538996/constants-in-objective-c Однако этот подход, по-видимому, создает константу, которая является глобальной и на которую можно ссылаться где угодно.
Меня больше интересовала константа, которую вы должны были указать в контексте, также используя имя класса. Допустим, у вас есть объект Event, тогда вы можете указать константы EventType (например, EVENTTYPE_DIRECT)
EventType.EVENTTYPE_DIRECT
Таким образом, вопрос в том, какими будут сегменты кода *.h и *.m для этого
2 ответа
Похоже, вы пришли из языка Java, как и я (извините, если я угадаю здесь). Некоторое время я тоже размышлял об этом, а потом заметил, как Apple определяет перечисления и использует их для определения констант, которые вы описываете.
Давайте использовать воображаемый класс Event
В качестве примера:
В заголовочном файле вы хотите определить новое перечисление:
typedef enum {
kEventType_EventName1,
kEventType_EventName2,
kEventType_EventName3
}EventType; //this is the name of the new type
где EventName1
и т. д., заменяется фактическими названиями событий, которые вы хотите (т.е. kEventType_Direct
,
Любой другой класс, который должен видеть эти типы событий, просто должен импортировать ваш файл Event.h:
#import "Event.h"
Тогда вы можете использовать EventType
как и любой другой тип переменной (учитывая, что он не является объектом NSO и не может быть сохранен, освобожден и т. д. - вы бы относились к нему как к любому другому типу C: int, float и т. д.)
Вы даже можете иметь типизированные переменные EventType в качестве членов других классов, если эти классы импортируют ваш заголовок Event.h.
Но это позволяет вам делать такие вещи:
-(void) handleEventOfType: (EventType) evtType {
switch(evtType) {
case kEventType_EventType1 :
//stuff here
break;
//etc...
}
}
Это лучший способ, который я видел до сих пор, и кажется, что он обычно практикуется за границей (по крайней мере, в большинстве проектов, которые я видел). Во всяком случае, надеюсь, что это помогает!
Непонятно, что вы пытаетесь сделать здесь - это "константа", используемая для замены свойства в классе, или Class1.CONSTANT должен возвращать другое значение для Class2.CONSTANT?
В любом случае кажется, что константы - это не правильный подход. В первом случае просто используйте средство доступа к недвижимости - если вы решите изменить это, инструменты рефакторинга сделают это тривиальным.
В последнем случае у каждого класса может быть метод класса с вашим обязательным именем, которое возвращает значение, соответствующее классу. Опять же, если это изменится, инструменты рефакторинга помогут.
Добавление констант к этому соединению кажется ненужным и вводит дополнительную зависимость (поддержание констант) без какой-либо реальной выгоды.