【问题标题】:How to dynamically build up the arguments for NSLog?如何动态构建 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) 一个巨大的、动态创建的参数“列表”

那会很酷。

【问题讨论】:

  • 根据您关于谓词的其他问题,复杂的谓词通常使用子谓词的显式实例作为对象而不是格式字符串来更好地结构化和生成

标签: iphone objective-c cocoa-touch nspredicate nslog


【解决方案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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 2016-12-30
      • 1970-01-01
      • 2010-10-30
      • 2023-01-10
      • 2019-09-21
      • 2021-07-11
      • 2019-05-09
      相关资源
      最近更新 更多