Xcode 6.1 'Swift REPL built into the Xcode debugger can inspect and manipulate your running app'不起



对于Xcode 6.1,其中一个更新点是:

Xcode调试器中内置的Swift REPL可以检查和操作你正在运行的应用

我创建了一个空项目,在viewDidLoad中设置了一个断点,当应用程序在断点处停止时,我在Xcode控制台中键入"repl",然后尝试用打印self

println(self)

但Xcode给了我一个错误:

错误:使用未解析的标识符"self"

但它不起作用。

问题是:我做错了什么?

事实证明,lldb中Swift实际上有两个表达式求值器,即repl和常规expression命令。两者在重要方面不同。

如果在导入到当前运行的应用程序中的新swift模块文件中输入代码,repl命令将像常规swift编译器一样评估代码。实际上,更准确地说,repl的每次连续调用都会向这样的模块添加代码,repl添加了一些强大的功能,比如能够重新定义Swift编译器不允许的类。因此,它对于定义全新的类、函数等非常有用。让repl使用这个全局上下文也是必要的,因为Swift中的一些定义只能在模块级别执行,而repl可以让您访问该语言的所有这些功能。OTOH,这意味着repl命令在运行repl命令的上下文中不可见。

expression命令评估代码时,就好像它是在当前停止的函数的上下文中运行的一样。这很有用,因为它允许您访问ivar和局部变量,并且实际上的行为可能与特定上下文中的代码类似。但执行该技巧的一个副作用是,它不可能完全像制作一个新模块一样——这正是repl应该模仿的。注意,在expr中不能做的事情是相当深奥的,并且在expression命令中构建scratch类之类的东西通常可以逃脱惩罚。您希望使用expr来运行println(self)命令。

简而言之,如果您想在调试时编写新的类等,请使用repl命令,但如果您想访问局部变量等,则使用expr

请注意,为了使事情稍微更令人困惑,repl实际上是一种风味或expr。如果您查看repl的lldb帮助,它会告诉您该命令是expression -r --的别名。有些人还使用另一个别名:print,也就是expression --。当在命令中输入真实表达式时,该别名非常方便地关闭选项解析。。。

最新更新