Константы другим именем

Прежде всего я видел этот вопрос и понимаю, почему следующий код не работает. Это не мой вопрос.

У меня есть константа, которая объявляется как;

//Constants.h
extern NSString * const MyConstant;

//Constants.m
NSString * const MyConstant = @"MyConstant";

Однако в определенных контекстах, более полезно иметь эту константу, имеют намного более описательное имя, как MyReallySpecificConstant. Я надеялся сделать:

//SpecificConstants.h
extern NSString * const MyReallySpecificConstant;

//SpecificConstants.m
#import "Constants.h"
NSString * const MyReallySpecificConstant = MyConstant;

Очевидно, я не могу сделать этого (который объяснен в связанном вопросе выше).

Мой вопрос:

Как еще (помимо чего-то как #define MyReallySpecificConstant MyConstant) я могу обеспечить единственную константу под несколькими именами?

6
задан Community 23 May 2017 в 11:51
поделиться

3 ответа

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

//Constants.h
extern NSString * const MyConstant;
extern NSString * const MyOtherConstant;

//Constants.m
#define MyConstantValue "MyConstant"
NSString * const MyConstant = @MyConstantValue;
NSString * const MyOtherConstant = @MyConstantValue;

Вы прячете #define в одном исходном файле, а не в заголовке. Вам нужно изменить значение только в одном месте. У вас есть два имени для одной константы. Конечно, в вашем сценарии с константами, определенными в нескольких файлах, вам пришлось бы сделать #define доступным для этих исходных файлов.

6
ответ дан 9 December 2019 в 20:40
поделиться

Назначьте ваши строковые константы в коде:

//Constants.h
extern NSString * MyConstant;
extern NSString * MyOtherConstant;
void setUpConstants();

//Constants.m
NSString * MyConstant;
NSString * MyOtherConstant;
NSString * const ValueOfString = @"A Value";
void setUpConstants()
{
    MyConstant = ValueOfString;
    MyOtherConstant = ValueOfString;
}

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

2
ответ дан 9 December 2019 в 20:40
поделиться

Моей первой реакцией на ваш вопрос был ответный вопрос - является ли тот факт, что вы хотите иметь константу с несколькими именами, показателем того, что имя константы требует переосмысления в первую очередь?

4
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: