如何覆盖为lldb po命令打印的内容,以获得快速枚举?

时间:2016-02-29 01:58:13

标签: ios swift debugging lldb

此问题是由调试器打印分配给枚举的关联值引起的。有自定义说明时有没有办法防止这种情况?对于这个微不足道的例子来说,这不是什么大不了的事,但如果你有字典或其他大型对象,它确实会污染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

我只想在调试器中显示对象时打印我的描述。我也尝试通过debugDescription做同样的结果。

1 个答案:

答案 0 :(得分:0)

你在某种程度上比较苹果和橘子。 po和CustomStringConvertible并非真正密切相关。

CustomStringConvertible和description指示将对象转换为String(因此名称)时所看到的内容。所以在调试器中你要做的就是说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。但为什么?你真的想扔掉现在恩赐给你的精彩镜像吗?在斯威夫特一生的第一年,我们抱怨说,po对于一个枚举根本没有提供任何信息,甚至不是它的情况;在这里,您不仅要了解案例,还要了解案例的相关价值。想要消除它,似乎非常逆行,而不是说弄巧成拙。