创建自定义可变参数日志功能

时间:2013-07-20 02:22:02

标签: objective-c logging variadic-functions variadic

我在Objective-C中尝试创建自定义Variadic日志记录功能,特别是我希望“重建”字符串格式,就像发送给NSLog的那样。我试图理解Variadic函数,但用于描述不同方面的语言已经超出我的想象,我发现的所有示例都是关于求和一堆整数而不是重建字符串格式。

我想要做的一个过于简单的例子就是这样:

(void) myLog (NSString*string,...) {
    NSLog(string,...);
}

也就是说我想将一个典型的字符串格式带入函数,并将该格式重建为函数内的字符串。

就像我说的这是一个非常简单的例子,会有更多的事情发生,而不仅仅是再次发回它,因此还有其他原因让我想要这样做。抛开这些原因:如何在Variadic函数内重建字符串格式?

更新:

目前我正在使用以下代码:

- (void) output:(NSString*)string {
    [_outputStorage appendAttributedString:[[NSAttributedString alloc] initWithString:string attributes:[NSDictionary dictionaryWithObject:[NSFont boldSystemFontOfSize:[NSFont smallSystemFontSize]] forKey:NSFontAttributeName]]];
    DDLogVerbose(@"%@", string);
}
...
[self output:[NSString stringWithFormat:@"You started out with %i tabs and I deleted %i (%i%%) of them.\n", totalTabs, deletedTabs, totalTabs ? 100*deletedTabs/totalTabs : 0]];

目前这有效,但是电话(上面的最后一行)是相当难以理解的。我想这样打电话:

myLog(@"You started out with %i tabs and I deleted %i (%i%%) of them.\n", totalTabs, deletedTabs, totalTabs ? 100*deletedTabs/totalTabs : 0]);

从技术上讲,我当前的代码工作正常,我想做出这个改变的原因是因为第二种方式更具可读性!启动“MyLog(...”的行比“自输出:[NSString stringWithFormat:...”

更可读

1 个答案:

答案 0 :(得分:1)

你可以这样做:

(void)myLog(NSString *format, ...) {
    va_list args;
    va_start(args, format);
    NSString *msg = [[NSString alloc] initWithFormat:format arguments:args];
    va_end(args);

    NSLog(@"%@", msg);
}

并按照你想要的方式调用它:

myLog(@"You started out with %i tabs and I deleted %i (%i%%) of them.\n", totalTabs, deletedTabs, totalTabs ? 100*deletedTabs/totalTabs : 0]);