7

对于 Xcode 6.1,更新点之一是:

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

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

println(self)

但是 Xcode 给了我错误:

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

但它不起作用。

问题是:我做错了什么?

4

1 回答 1

18

事实证明,在 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 --. 在将您的真实表达式输入命令时,该别名对于关闭选项解析非常方便......

于 2014-10-21T20:15:13.677 回答