Xcode 6.1’内置于Xcode调试器中的Swift REPL可以检查和操作正在运行的应用程序’无法正常工作

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

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

我创建了空项目,在viewDidLoad中设置断点,当app在断点处停止时,我在Xcode控制台中输入’repl’,然后尝试打印自己的

println(self) 

但是Xcode给了我错误:

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

但它不起作用。

问题是:我做错了什么?

事实certificate,lldb中的Swift实际上有两个表达式求值器, repl和正则expression命令。 这两者在重要方面有所不同。

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

expression命令评估代码,好像它在您当前停止的函数的上下文中运行。这很有用,因为它使您可以访问ivars和局部变量,并且实际上就像在特定上下文中的代码一样。 但是执行该技巧的一个副作用是它不能像创建一个新模块那样 – 这就是repl应该模仿的。 注意,你在expr中无法做的事情是相当深奥的,你可以经常在expression命令中建立临时类等。 您想使用expr来运行println(self)命令。

简而言之,如果要在调试时repl新类等,请使用repl命令,但如果要访问本地变量等,请使用expr

注意,为了使事情稍微混乱, repl实际上是一种风味或expr 。 如果你看一下llb帮助repl,它会告诉你命令是expression -r --的别名。 有些人还使用另一个别名: printexpression -- 。 该别名对于在将真实表达式输入命令时关闭选项解析非常方便…