Добавить разрыв строки в вывод Xcode

Скажем, у вас есть пользовательский объект, который имеет собственное описание, например:

class CustomObject {

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

Есть ли способ заставить разрыв строки \n работать в консоли при печати с помощью команды po в консоли LLDB?

Прямо сейчас LLDB печатает \n как часть текста и не обрабатывает его:

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

Где желаемый результат:

po object.customDescription
> Title: Hello
  Subtitle: World

У вас есть какое-нибудь решение для этого?


person Thomas    schedule 15.08.2017    source источник
comment
Внутри Swift Playground я наблюдаю за вашим желаемым поведением. let object = CustomObject.init() print(object.customDescription)   -  person JoePasq    schedule 15.08.2017
comment
@JoePasq Извините, посмотрев более внимательно, я понял, что на самом деле это не работает только при использовании po, и это то, что я хотел бы заставить работать!   -  person Thomas    schedule 15.08.2017
comment
Хорошо, это объясняет, спасибо. Пожалуйста, посмотрите этот вопрос. stackoverflow.com/questions/ 34278238/   -  person JoePasq    schedule 15.08.2017
comment
Вы должны внедрить новый форматировщик данных в LLDB. Краткое введение: lldb.llvm.org/varformats.html   -  person Code Different    schedule 15.08.2017
comment
Это выглядит очень многообещающе, я собираюсь попробовать, спасибо вам обоим!   -  person Thomas    schedule 16.08.2017


Ответы (1)


Я не хочу отговаривать вас от создания средства форматирования данных 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 напечатает debugDescription, а print напечатает description.

Если вы хотите стать более интересным или хотите, чтобы po представлял "структуру" вашего объекта так, как это делает результат po для Swift Arrays (например), вы можете создать собственный Mirror для своего класса. Здесь есть документация по этому поводу:

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

и если это не ясно, реализация зеркал находится в быстрых источниках в:

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

person Jim Ingham    schedule 17.08.2017
comment
Решение было таким простым... Спасибо! - person Thomas; 07.08.2018
comment
Это хорошо, но Objective-C на самом деле подчиняется и отображает перевод строки, когда вы вставляете строку. С другой стороны, вы также можете ввести печать в консоли, и отобразятся переводы строки. - person Alex Zavatone; 12.12.2019