Xcode 6.1的更新之一是:
Swift REPL内置于Xcode调试器,可以检查和操作运行中的应用程序
我创建了一个空项目,在viewDidLoad函数中设置了断点。当应用程序停在断点处时,在Xcode控制台中键入“repl”,然后尝试使用print self打印。
println(self)
但是Xcode给我报错:
错误:未解析的标识符'self'
但是它不起作用。
问题是:我做错了什么?
repl
和普通的expression
命令。这两者有重要区别。
repl
命令将代码评估为如果输入到新的Swift模块文件并导入到当前运行的应用程序中,那么常规的Swift编译器也会这样做。事实上,每次调用repl
都会向这样一个模块添加代码,并且repl
添加了一些强大的功能,例如能够重新定义Swift编译器不允许的类等。因此,它最适合定义全新的类、函数等。让repl
使用这个全局上下文也是必要的,因为Swift中的某些定义只能在模块级别进行,repl
使您可以访问语言的所有这些特性。然而,由于这意味着repl
命令几乎按定义没有进入repl
命令运行的上下文中的可见性。
expression
命令将代码评估为在当前停止的函数上下文中运行的代码。这很有用,因为它使您可以访问ivars和局部变量,并真正像可能在该特定上下文中的代码一样运行。但执行这个技巧的副作用是它不能完全像创建一个新模块一样,这就是repl
应该模拟的。请注意,您无法在expr
中执行的事情相当神秘,您通常可以通过在expression
命令中构建临时类等来逃避这些问题。您要使用expr
来运行您的println(self)
命令。repl
命令,但是如果您想访问局部变量等,请使用expr
。需要注意的是,repl
实际上是expr
的一种变体。如果查看lldb中关于repl的帮助,它会告诉你该命令是expression -r --
的别名。有些人还使用另一个别名:print
,即expression --
。这个别名在输入真正的命令表达式时非常方便,因为它可以关闭选项解析...