如何动态构建 NSLog 的参数?
Posted
技术标签:
【中文标题】如何动态构建 NSLog 的参数?【英文标题】:How to dynamically build up the arguments for NSLog? 【发布时间】:2010-06-19 19:58:26 【问题描述】:示例:我有一个复杂的方法,它做了很多事情,最后我想用 NSLog 打印一个报告。 NSLog 需要一个字符串,然后是任意数量的参数。所以可以说有这些可能的值可以记录:
一个
B
C
D
E
F
可能会发生 - 例如 - C 和 D 没有被记录,但其余部分都没有记录。我将如何构建一个动态的东西来代表 NSLog 的值参数?
我选择 NSLog 来回答这个问题,因为它可能更简单,因为 NSPredicate 和 SUBQUERY。在使用 NSMutableString 和 appendFormat:... 时动态构建 NSPredicate 格式字符串似乎是不可能的,它总是导致谓词的编译错误。我猜 NSPredicate 提供的格式值与 NSMutableString -appendFormat 不同。
因此,如果有办法为 NSPredicate 提供以下内容: 1) 一个巨大的、动态创建的格式字符串 2) 一个巨大的、动态创建的参数“列表”
那会很酷。
【问题讨论】:
根据您关于谓词的其他问题,复杂的谓词通常使用子谓词的显式实例作为对象而不是格式字符串来更好地结构化和生成 【参考方案1】:应该这样做,有条件地将部分附加到字符串:
NSMutableString* logMsg = [NSMutableString stringWithFormat:@"%@ %@ %@", A, B, C];
if (C) [logMsg appendFormat:@" %@", C];
if (D) [logMsg appendFormat:@" %@", D];
[logMsg appendFormat:@" %@ %@", E, F];
NSLog(@"%@", logMsg);
【讨论】:
【参考方案2】:您的根本问题不应该是问题。只需使用+predicateWithFormat:argumentArray:
。你有什么问题?
【讨论】:
很高兴它有帮助。如果您正在进行复杂的构建,您可能还需要考虑手动构建实际谓词并完全跳过格式字符串。当我将简单的搜索语法转换为谓词时,我使用了这种技术。如果你的谓词真的很大,这也可以更快,因为你跳过了字符串解析。请参阅此处的“直接在代码中创建谓词”:developer.apple.com/mac/library/documentation/cocoa/Conceptual/…【参考方案3】:如果您要一次收集要输出的字符串变量列表,只需使用NSMutableArray
根据需要添加一行日志输出。然后在流程结束时,用字符串连接组件:
NSMutableArray *logLines = [[NSMutable alloc] initWithCapacity:10];
...
NSLog(@"Multiple-line output:\n%@",[logLines componentsJoinedByString:@"\n"]);
[logLines release];
【讨论】:
以上是关于如何动态构建 NSLog 的参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何执行 shell 命令来填充 Jenkins 动态选择参数插件
如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库