对于 Xcode 6.1,更新点之一是:
Xcode 调试器中内置的 Swift REPL 可以检查和操作正在运行的应用程序
我创建了空项目,在 viewDidLoad 中设置了一个断点,当应用程序在断点处停止时,我在 Xcode 控制台中输入“repl”,然后尝试使用
println(self)
但是 Xcode 给了我错误:
错误:使用未解析的标识符“self”
但它不起作用。
问题是:我做错了什么?
事实证明,在 lldb 中实际上有两个 Swift 表达式评估器,therepl
和常规expression
命令。两者在重要方面有所不同。
repl
如果将代码输入到当前运行的应用程序中导入的新 Swift 模块文件中,该命令会像常规 swift 编译器一样评估代码。实际上,更准确地说,每次连续调用 都会repl
将代码添加到这样的模块中,并且 repl 添加了一些强大的功能,例如能够重新定义 Swift 编译器不允许的类。所以它对于定义全新的类、函数等非常有用。repl
使用这个全局上下文也是必要的,因为 Swift 中的一些定义只能在模块级别执行,并且repl
让您可以访问该语言的所有这些特性。OTOH,根据定义,这几乎意味着该repl
命令对您运行该repl
命令的上下文没有可见性。
该expression
命令评估代码,就好像它在您当前停止的函数的上下文中运行一样。这很有用,因为它使您可以访问 ivars 和局部变量,并且实际上就像可能在该特定上下文中的代码一样。但是执行该技巧的一个副作用是它不能完全像制作一个新模块 - 这repl
是应该模仿的。请注意,您不能做的事情expr
是相当深奥的,您通常可以在expression
命令中构建临时课程等。你想用来expr
运行你的println(self)
命令。
简而言之,如果您想在调试时创建新类等,请使用该repl
命令,但如果您想访问局部变量等,请使用expr
.
注意让事情稍微有点混乱,repl
其实是一种味道或expr
。如果您查看 repl 的 lldb 帮助,它会告诉您该命令是expression -r --
. 有些人还使用另一个别名:print
,即expression --
. 在将您的真实表达式输入命令时,该别名对于关闭选项解析非常方便......