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

标签 ios swift debugging lldb

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

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

最佳答案

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

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

当您说po testEnum 时的显示与反射(reflect) 枚举的方式有关。如果您不喜欢那样,您会想要实现 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 根本没有提供任何信息,甚至没有提供任何信息;在这里,您不仅学习案例,还学习该案例的相关值(value)。想要消除它似乎非常倒退,更不用说弄巧成拙了。

关于ios - 如何覆盖为 lldb po 命令打印的内容,以获得快速枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35690789/

相关文章:

delphi - 为什么 Delphi-XE2 64 位 Windows 程序不能在集成环境中运行?

iphone - 带有自定义 View 选择器的 UIBarButtonItem init 无法正常工作

ios - 保存高分

debugging - 实时调试stm32

ios - HKStatisticsCollectionQuery 工作一天然后停止。如何让更新处理程序无限期地工作?

swift - 与 UITextView 中的空格建立链接 - iOS Swift

c - 终端中带有 C 的文本文件

苹果手机 : how to solve this memory leak?

ios - 值为 0.5 和 1.0 的 NSNumbers 具有相同的哈希值

ios - Swift 显示来自 viewController 的 jpg 图片