我正在学习如何使用宏,但现在却与之相混淆。
我正在尝试创建一个NSString
连接,它只会将每个参数相互附加。
例如:concatOP(@"hey",@"Jude",@"Don't")
会返回NSString
,其中包含:@"heyJudeDon't"
我实际上制作了一些代码(这里也有一些代码)可以获得params的数量,但是我没有成功完成工作的第二部分。
#define NUMARGS(...) ( sizeof((int[]){__VA_ARGS__}) / sizeof(int) )
#define concatOP(...) NSMutableString *format = [[NSMutableString alloc] init];\
for( int i = 0; i < NUMARGS(__VA_ARGS__); i++){\
[format appendString:@"%@"];}\
[[NSString alloc] initWithFormat:format, __VA_ARGS__]
我实际上遇到了很多错误,告诉我格式不存在或者我错过了一些“;”或其他结束标签。
答案 0 :(得分:7)
这是你的宏:
#define concatOP(...) [@[__VA_ARGS__] componentsJoinedByString:@""]
编辑:
如果你放松你的宏NSString* result = concatOP(@"hey",@"Jude",@"Don't");
你会得到:
NSString* result = NSMutableString *format = [[NSMutableString alloc] init]; for( int i = 0; i < NUMARGS(@"hey",@"Jude",@"Don't"); i++){ format = [format appendString:@"%@"];} [[NSString alloc] initWithFormat:format, @"hey",@"Jude",@"Don't"];
看起来很奇怪。
答案 1 :(得分:3)
这并不能完全回答你的问题,但NSString
文字是由编译器连接起来的,就像它们的C对应物一样,所以这段代码开箱即用:
NSString *str = @"Hey" @"Jude" @"Don't";
与:
相同NSString *str = @"HeyJudeDon't";
这通常用于在源文件的多行中拆分长字符串文字。
底线;你不需要所有那些凌乱的宏和无意义的方法来做到这一点。
答案 2 :(得分:0)
我不知道如何用宏来做这件事。
你可以在Objective C中这样做:
实施类似的方法:
- (NSString *)concateStrings:(NSString *)firstArg, ...
{
NSMutableString *concatString = [[NSMutableString alloc] init];
va_list args;
va_start(args, firstArg);
for (NSString *arg = firstArg; arg != nil; arg = va_arg(args, NSString*))
{
[concatString appendString:arg];
}
va_end(args);
return concatString;
}
您可以将此方法称为:
NSLog(@"%@",[self concateStrings:@"hey",@"Jude",@"Don't",nil]) ;
输出:
heyJudeDon't
确保最后通过nil
。