2014-10-21 11 views
7

Dla Xcode 6.1 jednym punkcie jest aktualizacja:Xcode 6.1 „Swift REPL wbudowany debugger Xcode można kontrolować i manipulować swoją aplikację do jazdy” nie działa

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

Został utworzony pusty projekt, należy ustawić punkt przerwania w viewDidLoad, gdy aplikacja przestaje na przerwania, piszę „repl” w Xcode konsoli, a następnie próbuje drukować siebie z

println(self) 

Ale Xcode daje mi błąd:

error: use of unresolved identifier 'self'

Ale to nie działa.

Pytanie brzmi: co robię źle?

Odpowiedz

16

Okazuje się, że w rzeczywistości są dwie oceny oceniające dla Swift w lldb, repl i regularnej komendzie expression. Oba różnią się w istotny sposób.

Komenda repl ocenia kod tak, jak zwykły kompilator, który zostałby wprowadzony w nowym pliku modułu Swift, który jest importowany do aktualnie uruchomionej aplikacji. Właściwie, aby być dokładniejszym, każde kolejne wywołanie repl dodaje kod do takiego modułu, a replik dodaje kilka zaawansowanych funkcji, takich jak możliwość ponownego zdefiniowania klas, na które nie zezwala kompilator Swift. Jest więc najbardziej przydatna do definiowania całych nowych klas, funkcji itp. Posiadanie repl korzystania z tego globalnego kontekstu jest również konieczne, ponieważ niektóre definicje w Swift mogą być wykonywane tylko na poziomie modułu, a repl daje dostęp do wszystkich tych funkcji język. OTOH, oznacza to z definicji, że polecenie repl nie ma widoczności w kontekście, w którym uruchamiana jest komenda repl.

Komenda expression koduje kod tak, jakby działał w kontekście funkcji, w której aktualnie się zatrzymałeś. Jest to przydatne, ponieważ daje dostęp do ivars i lokalnych zmiennych i naprawdę działa jak kod, który może być w tym szczególny kontekst. Ale efekt uboczny wykonywania tej sztuczki polega na tym, że nie może ona być dokładnie taka, jak stworzenie nowego modułu - co ma naśladować emulator. Uwaga: rzeczy, których nie można wykonać w expr są dość ezoteryczne i często można uciec z budowaniem klas zarysowania i tym podobnych w poleceniu expression. Chcesz użyć polecenia expr, aby uruchomić polecenie println(self).

Krótko mówiąc, jeśli chcesz ugotować nowe klasy itp. Podczas debugowania, użyj polecenia repl, ale jeśli chcesz uzyskać dostęp do zmiennych lokalnych itp., Użyj expr.

Uwaga, aby rzeczy nieco bardziej zagmatwały, repl jest rzeczywiście smak lub expr. Jeśli spojrzysz na pomoc lldb dla repl, powiesz, że polecenie jest aliasem dla expression -r --. Niektórzy używają również innego aliasu: print, który jest expression --. Ten alias jest po prostu przydatny do wyłączenia analizowania opcji przy wpisywaniu prawdziwego wyrazu do polecenia ...

+0

Naprawdę miło wyjaśnia, dziękuję. Czy sądzisz, że w przyszłych wersjach będzie można uzyskać dostęp do zmiennych lokalnych w REPL? –

+0

Nie mogę tego przewidzieć. –

Powiązane problemy