【问题标题】:Prettier debug output printing Swift Dictionary in Xcode更漂亮的调试输出在 Xcode 中打印 Swift 字典
【发布时间】:2017-02-14 21:27:52
【问题描述】:

当我在 Swift 中的字典上使用 print() 时,它在控制台中显示得非常漂亮,带有一个键和一个值。

object = Optional({
customerId = 111;
transactionId = 333;
extraId = 444;
})

当我在同一个字典上运行po 时,它会吐出这个非常难以阅读的废话转储。

▿ Optional<Any>
▿ some : 3 elements
▿ 0 : 2 elements
  ▿ .0 : transactionId
  - .1 : 333
▿ 1 : 2 elements
  ▿ .0 : customerId
  - .1 : 111
▿ 2 : 2 elements
  ▿ .0 : extraId
  - .1 : 444

只使用p 更糟糕

(Any?) $R8 = some {
  payload_data_0 = 0x0000000170e679c0 {
  Swift._SwiftNativeNSDictionary = {}
  _heapBufferBridged_DoNotUse = 0x0000000170e679d0 {}
  nativeStorage = {
    buffer = 0x00000001703e4300 {
      Swift.ManagedBuffer = {}
    }
    initializedEntries = (values = 0x00000001703e4328, bitCount = 4)
    keys = 0x00000001703e4330
    values = 0x00000001703e4390
    }
  }
  payload_data_1 = 0x0000000000000000
  payload_data_2 = 0x0000000000000000
  instance_type = 0x0000000105ffc3f8
}

我可以在控制台中做些什么来查看我的变量,以便我可以实际阅读它们而无需筛选所有这些废话?

PS - 在这种情况下,我正在打印一个恰好是字典的 Optional&lt;Any&gt; 对象,但它与非可选字典相同。

【问题讨论】:

  • p object! 在调试器中打印什么?
  • 您应该查看 LLDB 数据格式化程序。我没有足够的能力让它工作,但这里是来自 WWDC 2014 的Advanced Swift Debugging in LLDB。数据格式化程序出现在 34 分钟左右。
  • this topic 的副本虽然我提供了一个新的解决方案 below

标签: swift xcode debugging


【解决方案1】:

新答案(2021 年):

获得可读输出的最快方法是使用:

po print(data)

说,你有变量data,如下所示:

let data: [String: Any] = ["value1": 64, "value2": true, "value3": "some"]

当您执行po print(data) 时,您将得到以下输出:

(lldb) po print(data)
["value1": 64, "value2": true, "value3": "some"]
0 elements

如果您不着急,可以按照below 中的回答中的步骤改进调试打印格式。

旧答案(2017 年):

expression debugPrint(object)

只需将上面的行放在调试器中,然后按 Enter。它会打印 以更易读的格式输出我们对象的内容。

您也可以使用另一个命令 - po print(data),即 更容易记住。

【讨论】:

  • 您是否能够为这些命令创建别名,这样我就不必在调试器中输入太多内容了?
  • @teradyl : 请参阅下面的答案以获取别名
【解决方案2】:

⚠️ (以前) 接受的答案仅将字典提供为非格式化的单行字符串,如下所示:

Optional(["transactionId": 333, "customerId": 111, "extraId": 444])

➡️一旦您获得更多键和嵌入的对象/字典,就会变得难以阅读。


PrettyPrint JSON 解决方案

  • 要获得漂亮的 json 格式(缩进、换行等),您可以通过在 lldb 终端 (source) 中运行此命令来定义一个别名(我命名为 pjson):
command regex pjson 's/(.+)/expr print(NSString(string: String(data: try! JSONSerialization.data(withJSONObject: %1, options: .prettyPrinted), encoding: .utf8)!))/'
  • 您可能不想每次打开 Xcode 时都重新定义别名,因此运行以下命令将别名定义附加到 ~/.lldbinit
echo "command regex pjson 's/(.+)/expr print(NSString(string: String(data: try! JSONSerialization.data(withJSONObject: %1, options: .prettyPrinted), encoding: .utf8)!))/'" >> ~/.lldbinit
  • 这将创建您可以在 Xcode 的 lldb 终端中使用的 pjson 别名:
pjson object

比较以下 Swift 对象的输出:

let object: Any? = [
    "customerId": 111,
    "transactionId": 333,
    "extraId": 444,
    "embeddedDict": [
        "foo": true
    ]
]

po print(data)的输出

Optional(["transactionId": 333, "embeddedDict": ["foo": true], "customerId": 111, "extraId": 444])

pjson的输出

{
  "transactionId" : 333,
  "embeddedDict" : {
    "foo" : true
  },
  "customerId" : 111,
  "extraId" : 444
}

【讨论】:

  • 在终端中输入您的永久echo 命令会导致zsh: event not found: ))/ 和/或bash: !: event not found。您知道问题所在或如何解决吗?
  • @pkamb 看起来你遇到了这个问题:serverfault.com/questions/208265/… 可能可以通过转义一些字符来解决,但我不会玩那个游戏。相反,您可以只复制命令(在双引号之间,或上面列出的),并将其添加到 ~/.lldbinit 文件中。
  • 如何获取从字典内容中选择的值?
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多