我在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:...”
更可读答案 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]);