2014-10-21 4 views
7

Für Xcode 6.1 arbeitet einer der Updatepunkt ist:Xcode 6.1 ‚Swift REPL in den Xcode Debugger gebaut können Ihre laufenden App inspizieren und manipulieren‘ nicht

Swift REPL built into the Xcode debugger can inspect and manipulate your running app

ich leeres Projekt erstellt haben, einen Haltepunkt in viewDidLoad, wenn app bei Breakpoint stoppt, ich bin Eingabe von 'repl' in Xcode Konsole und versucht dann selbst drucken mit

println(self) 

Aber Xcode gibt mir den Fehler:

error: use of unresolved identifier 'self'

Aber es funktioniert nicht.

Die Frage ist: Was mache ich falsch?

Antwort

16

Es gibt tatsächlich zwei Ausdruck Evaluatoren für Swift in lldb, der repl und der reguläre expression Befehl. Die beiden unterscheiden sich in wichtigen Punkten.

Der Befehl repl wertet den Code als regulären Swift-Compiler aus, wenn er in einer neuen Swift-Moduldatei eingegeben wird, die in die aktuell ausgeführte App importiert wird. Um genauer zu sein, fügt jeder nachfolgende Aufruf von repl Code zu einem solchen Modul hinzu, und der repl fügt einige mächtige Merkmale hinzu, wie zum Beispiel Klassen neu definieren zu können, die der Swift-Compiler nicht erlaubt. Daher ist es am nützlichsten, ganz neue Klassen, Funktionen usw. zu definieren. Die Verwendung des globalen Kontextes repl ist auch notwendig, weil einige Definitionen in Swift nur auf der Modulebene durchgeführt werden können und repl Ihnen Zugriff auf alle diese Funktionen der Sprache. OTOH, das bedeutet ziemlich genau per Definition der repl Befehl hat keine Sichtbarkeit in den Kontext, in dem Sie den repl Befehl ausführen.

Der Befehl expression wertet Code so aus, als würde er im Kontext der Funktion ausgeführt, in der Sie gerade angehalten werden. Dies ist nützlich, da Sie auf ivars und lokale Variablen zugreifen und sich wirklich wie Code verhalten bestimmter Kontext. Aber ein Nebeneffekt der Ausführung dieses Tricks ist, dass es nicht genau so sein kann wie ein neues Modul zu erstellen - was repl emulieren soll. Beachten Sie, dass die Dinge, die Sie in expr nicht tun können, ziemlich esoterisch sind, und Sie können oft mit dem Erstellen von Scratch-Klassen und dergleichen im expression-Befehl davonkommen. Sie möchten expr verwenden, um Ihren println(self) Befehl auszuführen.

Kurz gesagt, wenn Sie neue Klassen usw. beim Debuggen kochen möchten, verwenden Sie den Befehl repl, aber wenn Sie auf lokale Variablen usw. zugreifen möchten, verwenden Sie expr.

Hinweis, um Dinge etwas verwirrender zu machen, repl ist eigentlich ein Geschmack oder expr. Wenn Sie sich die lldb-Hilfe für repl ansehen, wird Ihnen mitgeteilt, dass der Befehl ein Alias ​​für expression -r -- ist. Einige Leute verwenden auch einen anderen Alias: print, der expression -- ist. Dieser Alias ​​ist nur praktisch, um das Parsen von Optionen zu deaktivieren, wenn Sie Ihren echten Ausdruck in den Befehl eingeben ...

+0

Wirklich nett erklären, danke. Glauben Sie, dass in zukünftigen Releases auf lokale Variablen in REPL zugegriffen werden kann? –

+0

Nicht dass ich vorhersehen kann. –