此问题是由调试器打印分配给枚举的关联值引起的。有自定义说明时有没有办法防止这种情况?对于这个微不足道的例子来说,这不是什么大不了的事,但如果你有字典或其他大型对象,它确实会污染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
做同样的结果。
答案 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
对于一个枚举根本没有提供任何信息,甚至不是它的情况;在这里,您不仅要了解案例,还要了解案例的相关价值。想要消除它,似乎非常逆行,而不是说弄巧成拙。