Я не хочу отговаривать вас от создания средства форматирования данных 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
let object = CustomObject.init() print(object.customDescription)
- person JoePasq   schedule 15.08.2017po
, и это то, что я хотел бы заставить работать! - person Thomas   schedule 15.08.2017