我想在其中添加带有NSString值的NSArray。我几乎可以肯定我可以使用#define
,但我不明白如何访问和初始化声明的变量。
例如,我有:
#define my_definition 0;
我知道如何访问这个0值。但是NSArray里面的NSString呢?
我有一个definitions.h文件。在那里我可以从任何我的班级访问。
答案 0 :(得分:4)
哇...你想在这做什么?
#define
是预处理器宏。预处理器对Objective-C一无所知(或者C就此而言......它只是一个美化的文本替换引擎),而Objective-C对预处理器一无所知。
除了可能数值(例如#define
s)或int
之外,您几乎肯定不希望NSString
。 (实际上,出于各种原因,您通常会看到extern NSString * ...
代替#define
。)
如果您需要访问对象中的特定NSArray
,则可以创建一个填充在-init
或类似内容中的ivar。如果其他类需要访问数组,请将其设为@property
或仅声明(公共)方法。
也许我误解了你想要做的事情?
答案 1 :(得分:3)
如果使用#define,则定义预处理器宏。它不是一个全局变量。相反,无论你使用哪个宏,它都将被#define之后的内容所取代,然后才能编译你的代码。
话虽如此,您可以像在其他地方一样定义NSArray:
#define kMyArray [NSArray arrayWithObjects:@"MyString1", @"MyString2", nil]
注意,我没有用分号结束这行。想象一下,如果我现在在我的代码中写了一些地方:
NSString *str1 = [kMyArray objectAtIndex:0];
这将被替换为:
NSString *str1 = [[NSArray arrayWithObjects:@"MyString1", @"MyString2", nil] objectAtIndex:0];
如果我的定义中有分号,我会收到编译错误。
答案 2 :(得分:2)
无论如何,基本思想是使用$字符作为宏前缀字符,然后使用可变参数。是的,gcc和Apple的LLVM编译器都支持这一点。基于一些例子,我已经完全疯了并转换了几乎所有的核心类型(数组,字符串,日期,字典等),但这里有一些想法可以帮助你:
#define $string( _format, _args... ) ( [NSString stringWithFormat: ( _format ), _args] )
#define $stringUTF8( _format, _args... ) ( [[NSString stringWithFormat: ( _format ), _args] UTF8String] )
// shorthand container creation (NSArray, NSMutableArray)
#define $array( _objs... ) ( { id objs[] = { _objs }; [NSArray arrayWithObjects: objs count: sizeof(objs) / sizeof(id)]; } )
#define $arrayM( _objs... ) ( { id objs[] = { _objs }; [NSMutableArray arrayWithObjects: objs count: sizeof(objs) / sizeof(id)]; } )
这可以让你做一些整洁的事情,如下所示:
NSArray * array;
array = $array( @"foo", @"bar", $string( @"This is a %@ string", @"formatted" ) );
保存整个大量的输入!
答案 3 :(得分:0)
#define MY_DEFINITION @[ @"String1", @"String2" ]
优选不含分号