#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;
Это также имеет то преимущество, что является типом, который вы можете передавать в / возвращать из функций, если вам требуется