更漂亮的调试输出在Xcode中打印Swift Dictionary

ter*_*dyl 6 debugging xcode swift

当我print()在Swift中使用字典时,它在控制台中显得漂亮而美观,带有键和值.

object = Optional({
customerId = 111;
transactionId = 333;
extraId = 444;
})
Run Code Online (Sandbox Code Playgroud)

当我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
Run Code Online (Sandbox Code Playgroud)

使用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
}
Run Code Online (Sandbox Code Playgroud)

我可以在控制台中以什么样的方式查看我的变量而不必筛选所有这些废话?

PS - 在这种情况下,我打印的Optional<Any>是恰好是字典的对象,但它与非可选字典相同.

Sta*_*ski 17

expression debugPrint(object)
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用另一个命令 - po print(data)这更容易记住.


agi*_*ult 13

?? (以前)接受的答案仅仅提供的字典作为非格式化的单一行字符串像这样:

Optional(["transactionId": 333, "customerId": 111, "extraId": 444])
Run Code Online (Sandbox Code Playgroud)

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


PrettyPrint JSON 解决方案

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

比较以下 Swift 对象的输出:

command regex pjson 's/(.+)/expr print(NSString(string: String(data: try! JSONSerialization.data(withJSONObject: %1, options: .prettyPrinted), encoding: .utf8)!))/'
Run Code Online (Sandbox Code Playgroud)

? 输出po print(data)

Optional(["transactionId": 333, "embeddedDict": ["foo": true], "customerId": 111, "extraId": 444])
Run Code Online (Sandbox Code Playgroud)

? 输出pjson

{
  "transactionId" : 333,
  "embeddedDict" : {
    "foo" : true
  },
  "customerId" : 111,
  "extraId" : 444
}
Run Code Online (Sandbox Code Playgroud)

  • @pkamb 看起来你遇到了这个:https://serverfault.com/questions/208265/what-is-bash-event-not-found#comment806622_208266 可能可以通过转义一些字符来解决,但我不会玩那个游戏。相反,您只需复制命令(在双引号之间或上面列出的命令),并将其添加到 `~/.lldbinit` 文件中。 (2认同)