Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在NSLog这样的方法中处理多个参数?_Objective C - Fatal编程技术网

Objective c 如何在NSLog这样的方法中处理多个参数?

Objective c 如何在NSLog这样的方法中处理多个参数?,objective-c,Objective C,以前有人问过这个问题,但我不明白。我有自己的屏幕记录器,它有一个“append”方法,该方法应该和NSLog一样工作,使用多个参数 因此,与其写这封信: int mynum = 19; NSLog(@"This is a number %d",mynum); 我想这样做: [Logger append:@"This is a number %d",mynum]; 你知道我该怎么做吗 谢谢你想要一个省略号,例如 -(SomeResult*)append:(id)object,... { i

以前有人问过这个问题,但我不明白。我有自己的屏幕记录器,它有一个“append”方法,该方法应该和NSLog一样工作,使用多个参数

因此,与其写这封信:

int mynum = 19;
NSLog(@"This is a number %d",mynum);
我想这样做:

[Logger append:@"This is a number %d",mynum];
你知道我该怎么做吗


谢谢你想要一个省略号,例如

-(SomeResult*)append:(id)object,... {
  id obj;
  va_list argumentList;
  va_start(argumentList, obj); 
  while (obj = va_arg(argumentList, id)) // Do something with obj
  va_end(argumentList);
  // ...
}

好吧,这是艰难的道路。:-)

使用stdarg.h宏创建附加参数的va_列表副本,然后使用
-initWithFormat:arguments:
方法创建一个字符串:

-(void) append:(NSString*)format, ... {
    va_list args, args_copy;
    va_start(args, format);
    va_copy(args_copy, args);
    va_end(args);

    NSString *logString = [[NSString alloc] initWithFormat:format
                                                 arguments:args_copy];
    // Append logString to your logger

    va_end(args_copy);
    [logString release];
}

这种方式为您提供了NSLog()本身的所有灵活性,支持任意数量和类型的参数。

注意,如果您只是想像您所说的那样进行日志记录,那么@Terente solution会更好,但不完全如此。:-)Stdarg宏是实现这一点的方法,但是您的示例只支持对象参数,并且在参数列表的末尾需要nil sentinel,而不是使用格式字符串。您也没有正确使用va_start()-应该是
va_start(argumentList,object)
@Sherm,好的,我的辩护是,我只是介绍了如何使用变量函数,当然不打算生成一些函数代码。(+1虽然指出了这一点)好吧,是的,那将是最简单的方法;)但既然我在这个话题上,我真的想努力尝试。
-(void) append:(NSString*)format, ... {
    va_list args, args_copy;
    va_start(args, format);
    va_copy(args_copy, args);
    va_end(args);

    NSString *logString = [[NSString alloc] initWithFormat:format
                                                 arguments:args_copy];
    // Append logString to your logger

    va_end(args_copy);
    [logString release];
}