对于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 --
。当在命令中输入真实表达式时,该别名非常方便地关闭选项解析。。。