Создание константы в target-c, которая называется свойством класса? (например, classA.KEY_FOR_ITEM1) - PullRequest
0 голосов
/ 04 декабря 2011

Каким был бы способ создать константу в target-c, которая называется свойством класса?(например, classA.KEY_FOR_ITEM1)

То есть я вижу совет относительно того, как создать константу здесь /470176/konstanty-v-objective-c Однако этот подход, по-видимому, создает глобальную константу, на которую можно ссылаться где угодно.

Меня больше интересовала константа, которую вы должны были указать в контексте, также используя имя класса.Допустим, у вас есть объект Event, тогда вы можете задать константы EventType (например, EVENTTYPE_DIRECT)

  EventType.EVENTTYPE_DIRECT

Так что вопрос в том, какими будут сегменты кода * .h и * .m для этого

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Мне кажется, что вы пришли из языка 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, и т. д.)

Вы можете даже иметь типизированные переменные EventType в качестве членов других классов, если эти классы импортируют ваш заголовок Event.h.

Но это позволяет вам делать такие вещи:

-(void) handleEventOfType: (EventType) evtType {

    switch(evtType) {
        case kEventType_EventType1 :
            //stuff here
            break;

        //etc...

    }
}

Это лучший способ, который я видел до сих пор, и, похоже, это тот путь, который обычно практикуется за рубежом (по крайней мере, в большинстве проектов, которые я видел). В любом случае, надеюсь, это поможет!

1 голос
/ 04 декабря 2011

Непонятно, что вы пытаетесь сделать здесь - это «константа», используемая для замены свойства в классе, или Class1.CONSTANT должен возвращать другое значение для Class2.CONSTANT?

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

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

Добавление констант в этот микс кажется ненужным и вводит дополнительную зависимость (поддержание констант) без какой-либо реальной выгоды.

...