recursiveDescription Methode in Swift?
Gibt es eine Möglichkeit, um [sich selbst.Ansicht recursiveDescription] in Swift? Ich bin versucht, diese Methode, aber ich erhalte die folgende Fehlermeldung:
'UIView' does not have a member named 'recursiveDescription'
Irgendwelche Vorschläge?
- FYI, Wenn Sie möchten, verwenden Sie [selbst.Ansicht recursiveDescription] beim Debuggen Swift-oder Obj-C, können Sie pause die app und po [self.Ansicht recursiveDescription]. [[UIWindow keyWindow] _autolayoutTrace] ist ideal für debugging-view-Einschränkungen, vor allem in Verbindung mit XCode6 visual debugger.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden, um Zugriff auf private /undokumentierte Objective-C-API (wie die
-recursiveDescription
Methode aufUIView
) von Swift können Sie Folgendes tun:UIView
).Erklären, die private Methode in die Kategorie-header:
Nun können Sie einen Haltepunkt festlegen und drucken Sie die rekursive Beschreibung in LLDB:
Wenn Sie wollen, um den view-Hierarchie in lldb, Sie müssen nicht fügen Sie alle Kategorien oder bridging-Header oder etwas ähnliches. Beim Debuggen von Objective-C-code, man würde in der Regel verwenden Sie den folgenden Befehl an der
(lldb)
prompt:Wenn, obwohl, Sie Sie pausiert haben in einer Swift-Rahmen, lldb kann erwarten, dass ein Swift-Ausdruck. Sie können aber ausdrücklich sagen
expr
(diepo
Abkürzung ist tatsächlich Berufungexpression
), die Sprache, der Ausdruck ist in:Dem gleichen Muster auftreten, in iOS 8, bei der Anzeige der view-controller Hierarchie, mit:
oder im Swift-Rahmen:
In der WWDC 2018 Advanced Debugging mit Xcode, Sie schlage vor, sich Weg von diesem komplizierten
expr
syntax durch die Definition eines alias,poc
, erstellen Sie eine Textdatei,~/.lldbinit
mit der folgenden Zeile:Dann können Sie Sachen wie tun:
Es ist erwähnenswert, dass Xcode 8 eingeführt, die anzeigen debugger (klicken Sie auf ), bietet eine interaktive Art und Weise zu analysieren, die view-Hierarchie, weitgehend eliminiert die Notwendigkeit für die LLDB
recursiveDescription
von der view-Hierarchie. Weitere Informationen finden Sie unter der WWDC 2016 video Visual Debugging mit Xcode. Zugegeben, manchmal haben wir bis zum Ende wieder fallen zurecursiveDescription
Technik, die oben gezeigt, aber die meiste Zeit die Sicht debugger macht dies eine weitaus natürlicher, intuitiver Prozess.Und in Xcode 9, hab Sie erweitert diese Ansicht, debugger, so enthält es jetzt die jeweiligen view-Controllern, zu:
NSLog
oderprint
. Dieexpr
wird schon drucken Sie den Ausdruck für Sie. Zweitens, und um deine Frage zu beantworten, Nein, ich weiß nicht, warum genau Sie nicht findenself
bei der Verwendung von Objective-C und Swift-Rahmen (oder Umgekehrt, BTW), aber es scheint nicht erstaunlich, entweder. Natürlich, bei der Verwendung von[[UIWindow keyWindow] recursiveDescription]
oder[UIViewController _printHierarchy]
Sie nicht findenself
an alle, es ist also ein nicht-Thema, aber es ist eine interessante Beobachtung.po self.foo.bar.someView
), um seine Adresse. Sie erhalten eine Ausgabe wie<UIView: 0x10bd0a600; …>
. Mit dieser Adresse können Sie dann dump die Hierarchie mit Rob ' s trick, wie diese:expr -l objc++ -O -- [0x10bd0a600 recursiveDescription]
Swift 2.0 können Sie einfach starten Sie:
In (geprüft mit iOS10 Beta3) swift 3.0-das ist ein bisschen komplexer:
po let s = view.perform("recursiveDescription"); print(s)
Fügen Sie zunächst eine Kategorie
@interface
ohne@implementation
in Ihrer bridging-header.dann in der Konsole
Der Schlüssel hier ist
as NSString
nichtas String
Es ist notwendig, geben Sie es in Objective-C-format, da UIKit ist in Objective-C framework.
Rekursive Beschreibung existiert nur zu debugging-Zwecken. Es ist nicht Teil der öffentlichen API und daher nicht zur Verfügung Swift
Swift ist eine strenge Sprache und erlaubt es Ihnen nicht zum aufrufen von Funktionen, die nicht streng definiert.
Objective-C, es ist eine dynamische Sprache, so können Sie Funktionen aufrufen, wie diese.
Also, was wir tun müssen, ist zu sagen, dass der debugger auswerten dieses Ausdrucks in eine Objective-C-syntax
Und die Art und Weise, das zu tun, ist Ausdruck verwenden mit der option - l objc
-O, dem debugger sagen, dass wir auch wollen, dass die debug-Beschreibung die gleiche wie po tun würde -- und zu zeigen, dass es keine weiteren Optionen.
Müssen wir setzen [self.Ansicht] Ansicht wieder Zecken.
Wieder Zecken ist wie ein preproccess Schritt, sagt der erste, bewerten Sie den Inhalt dieser in das aktuelle Bild einfügen und das Ergebnis, und dann können wir beurteilen, der rest.
Meine Antwort wird genommen aus der WWDC 2018 Sitzung 412 advanced debugging mit Xcode und lldb.
Hinzufügen, um den bridging-header eine Erklärung, in der Kategorie UIView mit dieser Methode.
Gebäude auf @Rob Mayoff ist Antwort: