对于 swift 枚举,如何覆盖为 lldb po 命令打印的内容?

How to override what's printed for lldb po command, for a swift enum?

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

我有一个简单的 swift 枚举。在调试器中执行 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 和 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 在枚举上根本没有提供任何信息,甚至没有提供任何信息;在这里,您不仅学习案例,还学习该案例的相关价值。似乎逆行得要命,不说弄巧成拙,就想把它去掉。