我想在其中添加带有 NSString 值的 NSArray 。我几乎可以肯定我可以使用#define
它,但我不明白如何访问和初始化声明的变量。例如我有:
#define my_definition 0;
而且我知道如何访问这个 0 值。但是 NSArray 中的 NSString 怎么样?
我有一个定义.h 文件。在那里,我可以从我的任何班级访问。
我想在其中添加带有 NSString 值的 NSArray 。我几乎可以肯定我可以使用#define
它,但我不明白如何访问和初始化声明的变量。例如我有:
#define my_definition 0;
而且我知道如何访问这个 0 值。但是 NSArray 中的 NSString 怎么样?
我有一个定义.h 文件。在那里,我可以从我的任何班级访问。
哇...你想在这里做什么?
#define
是一个预处理器宏。预处理器对 Objective-C (或者 C ……它只是一个美化的文本替换引擎)一无所知,而 Objective-C 对预处理器一无所知。
#define
除了数值(例如int
s)或a 之外,您几乎肯定不想要 a NSString
。(实际上,由于各种原因,您通常也会看到extern NSString * ...
代替。)#define
如果您需要访问NSArray
对象中的特定内容,您可以创建一个您填充的 ivar-init
等。如果其他类需要访问该数组,请将其设为@property
或仅声明一个(公共)方法。
也许我误解了你想要做什么?
如果你使用#define,你定义了一个预处理器宏。它不是一个全局变量。相反,无论您在哪里使用该宏,它都会被#define 之后的内容替换,然后才会编译您的代码。
话虽如此,您可以像在其他地方一样简单地定义一个 NSArray:
#define kMyArray [NSArray arrayWithObjects:@"MyString1", @"MyString2", nil]
请注意,我没有以分号结束这一行。想象一下,如果我现在在代码中的某个地方写下:
NSString *str1 = [kMyArray objectAtIndex:0];
这将被替换为:
NSString *str1 = [[NSArray arrayWithObjects:@"MyString1", @"MyString2", nil] objectAtIndex:0];
如果我的定义中有分号,我会得到一个编译器错误。
几个月前我遇到了别人的代码,我根据自己的目的进行了调整,主要是为了节省自己的大量打字时间。我提前向原作者道歉,我很想在应得的地方给予赞扬,但我翻遍了我的硬盘,找不到原始样本或他或她的名字。如果我确实遇到了原始来源,我会用原作者的名字修改这篇文章。
无论如何,基本思想是使用 $ 字符作为宏前缀字符,然后采用可变参数。是的,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" ) );
节省大量打字!
#define MY_DEFINITION @[ @"String1", @"String2" ]
最好不要分号