REPL 和调试器
社区使用 LLDB 调试器 为 Swift 语言提供丰富的 REPL 以及调试环境。Swift 与调试器中嵌入的 Swift 编译器版本紧密耦合。编译器和调试器的紧密集成能够准确检查 Swift 类型,并在快速发展的语言环境中进行功能齐全的表达式求值。
然而,由于这种紧密集成,开发人员必须使用使用相同源文件构建的匹配的编译器和调试器对。使用任何其他版本的 LLDB 进行调试可能会导致不可预测的结果。
为什么要结合 REPL 和调试器?
有几个动机因素促成了使用 Swift 调试器作为 Swift REPL 基础的决定。
-
集成调试。 最明显的好处是 Swift REPL 也是一个功能齐全的调试器。声明一个函数、在其中设置断点,然后调用它非常简单。当执行在断点处停止时,调试器的全套功能立即可用。
1> func answer() -> Int { 2. return 42 3. } 4> :b 2 4> answer() Execution stopped at breakpoint. Enter LLDB commands to investigate (type help for assistance.) 1 func answer() -> Int { -> 2 return 42 3 }
-
从故障中恢复。 Swift 中的致命错误通常会导致进程立即终止,这对于生产代码中的程序员错误是有意义的,但在交互式环境中是不希望的。Swift REPL 支持使用完整的调试器调查故障或进行回溯以立即恢复。
1> ["One", "Two"][2] fatal error: Array index out of range Execution interrupted. Enter Swift code to recover and continue. Enter LLDB commands to investigate (type :help for assistance.)
-
强大的表达式求值。 在调试器中支持全方位的 REPL 场景为表达式求值器设置了高标准。因此,调试器中的表达式可以访问 Swift 中的全方位语言功能,并且可以自由声明任何有效的语言构造。
-
一致的结果格式化。 用于以文本方式表示 REPL 中值的策略与调试器共享,即使对于用户定义的类型也能确保一致的输出。
Xcode Playground 支持
Swift 开发者可以通过多种不同的方式学习这门语言。除了传统的命令行编译器和交互式 REPL 之外,许多开发者最早的体验之一是通过 Xcode 中引入的 playground。在 Swift 3.0 和 Xcode 8 之前,这只能通过 Xcode 附带的 Swift 版本来实现。Xcode Playground Support 项目支持构建一个 Swift 工具链,其中包含与 Xcode 8 playground 体验集成所需的一切。Playground Support 将包含在相应的快照中。下载快照,安装它,并选择工具链以在 Xcode playground 中使用最新的 Swift 功能。
该项目构建了两个框架
-
PlaygroundSupport。 此框架定义了 playground 代码可以显式引用的 API,以便与 Xcode 通信。例如:这对于识别要实时显示以进行动画或交互的特定视图的 playground,以及在满足定义的条件时 playground 在页面之间自动移动的情况很典型。
-
PlaygroundLogger。 此项目隐式用于逐行记录感兴趣的值并将其传递给 Xcode。调用会自动注入到 playground 代码中,因此不需要显式引用。