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 --
的别名。 有些人还使用另一个别名: print
, expression --
。 该别名对于在将真实表达式输入命令时关闭选项解析非常方便…