【问题标题】:Add line break to Xcode output在 Xcode 输出中添加换行符
【发布时间】:2017-08-15 13:18:00
【问题描述】:

假设您有一个自定义对象,该对象具有如下自定义描述:

class CustomObject {

    var customDescription: String {
        return "Title: Hello, \n Subtitle: World"
    }
}

在 LLDB 控制台中使用 po 命令打印时,有没有办法让换行符 \n 在控制台中工作?

现在 LLDB 将 \n 打印为文本的一部分并且不对其进行处理:

po object.customDescription
> "Title: Hello, \n Subtitle: World"

想要的结果在哪里:

po object.customDescription
> Title: Hello
  Subtitle: World

你有什么解决办法吗?

【问题讨论】:

  • 在 Swift Playground 中,我观察到你想要的行为。 let object = CustomObject.init() print(object.customDescription)
  • @JoePasq 很抱歉,仔细查看后我意识到它实际上只在使用 po 时不起作用,这是我想要工作的!
  • 好的,这就解释了,谢谢。请看这个问题。 stackoverflow.com/questions/34278238/…
  • 您必须在 LLDB 中实现一个新的数据格式化程序。这是一个快速介绍:lldb.llvm.org/varformats.html
  • 这看起来很有希望,我会尝试一下,谢谢你们!

标签: swift xcode lldb


【解决方案1】:
po object.customDescription as NSString

【讨论】:

    【解决方案2】:

    我不想阻止您为您的课程制作 lldb 数据格式化程序。与po 相比,它们的优势在于它们为 lldb 提供了一种向您显示数据摘要表示的方法,而无需在运行的程序中调用代码。此外,如果您使用 Xcode,Xcode 本地视图将自动显示您的数据格式化程序。

    但要清除po 的工作方式:

    lldb po 命令通过为您提供的表达式解析为的对象调用语言指定的描述方法来工作。因此,例如在您的示例中,您看到了 Swift String 类的描述方法的结果,它显示了字符串的“程序员视图”。

    对于 Swift,有几种方法可以提供描述。最简单的就是实现CustomStringConvertible协议:

    class CustomObject : CustomStringConvertible {
    
        var description: String {
            return "Title: Hello,\n Subtitle: World"
        }
    }
    
    func main()
    {
      let my_object = CustomObject()
      print (my_object)
    }
    
    main()
    

    然后当你调试这个时,你会看到:

    (lldb) br s -p print
    Breakpoint 1: where = desc`desc.main() -> () + 27 at desc.swift:11, address = 0x000000010000116b
    (lldb) run
    Process 69112 launched: '/private/tmp/desc' (x86_64)
    Process 69112 stopped
    * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
        frame #0: 0x000000010000116b desc`desc.main() -> () at desc.swift:11
       8    func main()
       9    {
       10     let my_object = CustomObject()
    -> 11     print (my_object)
                     ^
       12   }
       13   
       14   main()
    Target 0: (desc) stopped.
    (lldb) po my_object
    Title: Hello,
     Subtitle: World
    
    (lldb) c
    Process 69112 resuming
    Title: Hello,
     Subtitle: World
    Process 69112 exited with status = 0 (0x00000000) 
    

    请注意,po 和 swift print 函数都以相同的方式呈现您的对象。

    如果您想要单独的调试和打印描述,那么您还需要实现CustomDebugStringConvertible,这需要debugDescription 属性。然后po 将打印debugDescriptionprint 将打印description

    如果你想变得更漂亮,或者想让 po 代表对象的“结构”,就像 Swift 数组的 po 结果一样(例如),你可以为你的班级定制一个 Mirror .这里有相关文档:

    https://developer.apple.com/documentation/swift/mirror

    如果不清楚,Mirrors 的实现在以下 swift 资源中:

    https://github.com/apple/swift/blob/master/stdlib/public/core/Mirror.swift

    【讨论】:

    • 解决方案非常简单...谢谢!
    • 这很好,但是当你 po 字符串时,Objective-C 实际上会遵守并显示换行符。另一方面,您也可以在控制台输入 print 并显示换行符。
    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2010-12-10
    相关资源
    最近更新 更多