2

我正在学习如何使用宏,但现在对宏感到困惑。

我正在尝试创建一个NSString连接,它只会将每个参数附加到彼此。

例如:concatOP(@"hey",@"Jude",@"Don't")将返回一个NSString包含:@"heyJudeDon't"

实际上,我编写了一些代码(也可以在此处找到一些代码)来获取参数的数量,但我没有成功完成工作的第二部分。

#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__]

我实际上得到了很多错误,告诉我格式不存在或者我错过了一些“;” 或其他结束标签。

4

3 回答 3

8

这是你的宏:

#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"];

看起来很奇怪。

于 2014-01-22T13:43:17.383 回答
3

这并不能完全回答您的问题,但NSString文字由编译器连接,就像它们的 C 对应物一样,因此此代码开箱即用:

NSString *str = @"Hey" @"Jude" @"Don't";

这与以下内容相同:

NSString *str = @"HeyJudeDon't";

这通常用于在源文件的多行中拆分长字符串文字。

底线;你不需要所有那些凌乱的宏和无意义的方法来做到这一点。

于 2014-01-22T14:21:18.133 回答
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在最后通过。

于 2014-01-22T13:41:26.373 回答