【问题标题】:How to override what's printed for lldb po command, for a swift enum?如何覆盖为 lldb po 命令打印的内容以进行快速枚举?
【发布时间】:2016-02-29 01:58:13
【问题描述】:

此问题是由调试器打印分配给枚举的关联值引起的。当您有自定义描述时,有没有办法防止这种情况发生?对于这个微不足道的例子来说,这没什么大不了的,但是如果您有字典或其他大型对象,它确实会污染po 输出。

我有一个简单的快速枚举。在调试器中执行po 命令时,我试图覆盖它打印的内容。但是,lldb 正在打印对象的description,然后是枚举的转储。例如,给定以下代码:

enum TestEnum : CustomStringConvertible {
    case Value1(test:Int)

    var description: String {
        return "Test Enum"
    }
}

当我尝试打印 TestEnum 类型的对象时,或者当它嵌套在另一个要打印的对象中时,我会得到这种类型的输出:

(lldb) po testEnum
▿ Test Enum
  - Value1 : 1000

我只想在调试器中显示对象时打印 my 描述。我也尝试通过debugDescription 执行此操作,结果相同。

【问题讨论】:

  • 我不确定你在说什么?在调试器中,我要求“po response.value!”它的类型是 optional。在另一个示例中,我也尝试覆盖 debugDescription,但得到了相同的结果。据我所知,lldb 正在打印自定义描述,然后仍在为枚举进行内部默认打印。
  • 是的,感谢您指出这一点。我决定放弃前面的示例并粘贴在一个简化的示例中。这帮助我确定了它在做什么。它正在打印与枚举关联的每个分配值的值。这就是我想要尝试和防止的。
  • 好的,谢谢。没有依赖关系的简化示例构成了一个 MCVE,并给了我一些让我沉迷其中的东西。 :)

标签: ios swift debugging lldb


【解决方案1】:

在某种程度上,您是在比较苹果和橙子。 po 和 CustomStringConvertible 并不是非常密切相关。

CustomStringConvertible 和description 规定了将对象转换为字符串时所看到的内容(因此得名)。所以在调试器中你想做的是说po String(testEnum)。 (或者根本不使用 lldb;只需从正在运行的程序打印到控制台,使用 print(testEnum);这就是 CustomStringConvertible 的真正用途。)

当您说po testEnum 时的显示与枚举的反射方式有关。如果你不喜欢这样,你会想要实现 CustomReflectable——但我不相信你真的想要这样做,我稍后会讨论。先举个例子:

enum TestEnum : CustomStringConvertible, CustomReflectable {
    case Value1(test:Int)

    var description: String {
        return "Test Enum"
    }

    func customMirror() -> Mirror {
        return Mirror(reflecting:self.description)
    }

}

现在po testEnum 将产生Test Enum。但为什么?你真的想扔掉现在枚举给你的精彩镜像吗?在 Swift 生命的第一年,我们抱怨枚举中的 po 根本没有提供任何信息,甚至没有提供任何信息;在这里,您不仅要了解案例,还要了解该案例的相关价值。想要消除它,这似乎是非常倒退,不是说弄巧成拙。

【讨论】:

  • 其中一个关联值是一个字典,它在显示时可能相当大。我使用自定义描述很好地打印了这本词典的内容。字典的默认打印很丑陋且难以阅读。所以基本上,在打印时,我会看到一个格式很好的打印件,然后是一个非常丑陋的打印件。也就是,该对象被打印了两次。
  • 我有点担心实现 customMirror 只是为了在调试器中获得良好的输出。所以可能不会这样做。但非常感谢。
  • 是的,我建议说po String(...) 然后继续。 :)
  • 或者根本不要po。如果您不想看到镜像,p 会提供更好的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2014-09-07
  • 2020-09-02
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多