Прежде всего я видел этот вопрос и понимаю, почему следующий код не работает. Это не мой вопрос.
У меня есть константа, которая объявляется как;
//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
) я могу обеспечить единственную константу под несколькими именами?
В общем, компилятор будет складывать одинаковые строковые константы в одинаковые строки, если вы не запретите ему это делать. Даже если вы не можете инициализировать одну константу другой, инициализация их обеих одинаковым значением будет иметь одинаковый чистый эффект.
//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 доступным для этих исходных файлов.
Назначьте ваши строковые константы в коде:
//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;
}
Один минус в том, что они не защищены компилятором от модификации. Однако инициализация очень гибкая, и вы, возможно, сможете улучшить другой код. Вы также гарантируете различные адреса для ваших строк, независимо от того, решит ли компилятор, что складывание - это то, что он делает на этой неделе.
Моей первой реакцией на ваш вопрос был ответный вопрос - является ли тот факт, что вы хотите иметь константу с несколькими именами, показателем того, что имя константы требует переосмысления в первую очередь?