Objective C: доступ к константам из других классов

#iphone #objective-c #ios #class #constants

#iPhone #objective-c #iOS #класс #константы

Вопрос:

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

 #define kStateRunning 1
#define kStateGameOver 2
#define kStateMenu 3
  

которые находятся в моем GameController.h from Level1.m . У Level1.h меня есть @class GameController , а также импорт в файле реализации.

Я попытался найти ответ, но я не уверен, правильно ли я все это формулирую.

Комментарии:

1. Если константы находятся в файле gamecontroller.h, и вы импортируете их в level1.m, они должны быть доступны. Вы спрашиваете, правильно ли вы это делаете, или это не работает?

2. Чего-то не хватает. Если константы определены в GameController.h , то для доступа к ним почему бы и нет #import GameController.h ?

Ответ №1:

Если вы используете #define myConstant , myConstant будет известно, поскольку вы импортируете свой файл. Определите их в начале вашего GameController.h между импортом и @Interface например.

Затем, если вы импортируете GameController.h один из ваших других файлов (давайте возьмем Level1.m , к примеру). Вы можете использовать его без префикса. Просто используйте myConstant

Комментарии:

1. Я пытался добавить к нему префикс, это была моя проблема

2. если вы используете #define , это не часть класса. Например, у вас может быть файл со всеми вашими определенными константами, и в этом файле нет класса.

Ответ №2:

Я бы не стал использовать #define , поскольку вы теряете какие-либо проверки со стороны компилятора. Обычно вы используете константу, чтобы избежать использования магических значений во всем коде, которые могут быть неправильно написаны или неправильно введены.

В руководстве Apple docs по кодированию говорится, как вы должны подходить к каждому типу констант.

Для простых целых чисел, как у вас, они предлагают enums лучший вариант. Они широко используются во фреймворках Apple, поэтому вы знаете, что они хороши.

Вам все равно нужно будет определить это в своем заголовке.

например (используйте свой собственный префикс вместо PS )

 typedef enum {
    PSGameStateRunning  = 1,
    PSGameStateGameOver,
    PSGameStateMenu,
} PSGameState;
  

Это также имеет то преимущество, что является типом, который вы можете передавать в / возвращать из функций, если вам требуется