Swift REPL简介

原文链接https://developer.apple.com/swift/blog/?id=18

Xcode 6.1引入了另外一种以交互式的方式来体验Swift的方法:Read Eval PrintLoop,简称REPL。那些对解释型语言比较熟悉的开发者会对这个命令行的环境感到很惬意,更有经验的开发者会发现很多新奇的特性。闲话少说,言归正传。要想使用REPL,请先启动Terminal.app(该程序在/Applications/Utilities下面),如果你使用的OS X Yosemite系统,那么请在窗口中输入“swift”,如果你使用的是OS X Mavericks系统,那么请在窗口中输入“xcrun swift”。输入完成之后,我们就进入了Swift REPL环境之中:

Welcome to Swift version 1.1(swift-600.0.20.0). Type :help for assistance.
1>

进入环境之后,你需要做的就是输入Swift语句,REPL会马上执行输入的代码。REPL系统会自动组装表达式的结果,并将结果与输入的语句一起展示出来。控制台以交互式会话的方式来展示结果:

1>”100”.toInt()
$R0: Int? = 100
2> let name =”Katherine”
name: String =”Katherine”
3>print(“Hello,(name)”)
Hello,Katherine

注意,虽然并没有明确地将第一行表达式的结果值赋给一个变量,但REPL还是为结果起了一个名字($R0)。你可以在后面的语句中通过这个名字使用它所代表的结果值:

4> $R0! + 200
$R1: Int = 300

Swift编译器可以识别未输入完整的代码,并在需要的时候提示你要输入完全。你的代码甚至会像在Xcode里面那样自动缩进。比如,编写一个函数

5> functimesTwo() {
6.

后续行的提示一个后面紧跟句号的行号,而非提示一条新语句的尖括号。通过这个提示,你一眼就能看出自己还需要完成一个代码段。因此,你可以在还未完成的函数中继续输入剩下的代码

5> functimesTwo() {
6.     return value * 2
7. }

有三个需要注意的地方:第一,上面的第六行代码在最开始的时候是缩进了的,但REPL在我们输入了函数结束符(})之后自动取消了缩进;第二,这个函数引用了一个我们忘记声明的变量(value),并且函数还缺少了返回类型,因此,你需要将这两个bug修复掉;第三,修复代码问题永远都不晚,即使你已经完成了整个函数的编写。

多行历史记录(Multi-Line History)
代码被提交到编译器的时候,它也同时被记录在了REPL历史中,这使得修正错误不再重要。如果你在未编写完整的函数(就像上面的函数)的最后按下了回车键,那么此时你会看到如下提示信息:

error:use of unresolved identifier ‘value’

就像很多系统(译者注:如Linux)中已经实现的那样,你可以通过在终端上使用向上箭头来调用最近几次所输入的命令。REPL会将上面例子中的三行代码完全找回,并且将光标放在最后面。现在,你可以继续编写代码修改之前犯下的错误

REPL能够在会话之间保存成百上千的代码段的历史。每次你按下向上箭头键的时候,终端上就会出现你更早一次所输入的命令。每次按下向下箭头键的时候,终端上就会出现你更近一次所输入的命令。就像我们在下面讨论的那样,在出现下一条具体的命令之前的空行会显得非常的实用。

多行编辑(Multi-Line Editing)
虽然REPL的行为有点像传统的行编辑器,但它仍然为处理像很多类或者函数声明那样的多行输入提供了非常方便的特性。如上面的例子所示,在最后一行按下回车键之前,你可以使用向上箭头来将光标移动到声明行,然后使用向左箭头来将光标移动到左括号(()之后以完善参数列表:

5> functimesTwo() {
6.     return value * 2
7. }

输入参数声明,之后使用向右的箭头来将光标移动到右括号())之后并添加返回值类型:

5> functimesTwo(value: Int) -> Int {
6.     return value * 2
7. }

这个时候,你不能按下回车键以完成函数声明,因为光标还在代码块的中间。如果在这里按下回车键,就会插入一个换行符。如果你试图在一个函数方法体中插入多余的行,那么这个换行符就会发挥作用,但是在这里你只是想转到函数声明的最后去。你可以快速地按向下箭头两次来实现你的愿望,或者使用Emacs序列ESC >(escape键后跟一个尖括号)。在最后面一行的末尾按下回车键会编译刚声明的函数,现在这函数就可以被调用了:

8> timesTwo(21)
$R2: (Int) = 42

表达式完成状态的自动检测意味着在大多数时候你可以只是输入代码而REPL会帮你将语句补充完整。然而,有些时候,因为语句之间的相互依赖性,同时提交多个声明是很有必要的。请看下面的代码

func foo() {
    bar()
}
func bar() {
    foo()
}

如果一行一行地输入上面的代码,会导致当第三行代码写完的时候编译第一个函数代码,这也会导致如下报错:

error:use of unresolved identifier ‘bar’

你可以在同一行代码中声明两个函数来规避当你按下回车键所发生的自动完成检测。但是,还有更好的方法。当完成了上面的前三行的输入之后,你可以按向下箭头来手动生成第四行,然后正常输入剩下的代码。这两个函数在一起被编译,这样就达到了互递归(两个函数相互调用)的目的。

快速入门(Quick Reference)
为了让大家快速迈出第一步,这里提供一个最常使用的编辑和导航的快捷键列表:

箭头键                   将光标向左/右/上/下移动

Control+F               将光标向右移动一个字符

Control+B               将光标向左移动一个字符

Control+N               将光标移动到下一行

Control+P               将光标移动到上一行

Control+D               删除被光标选中的字符

Option+Left             将光标移动到前一个单词的开始处

Option+Right            将光标移动到下一个单词的开始处

Control+A               将光标移动到当前行的开始处

Control+E               将光标移动到当前行的结束处

Delete                  删除光标左边的字符

Esc <                   将光标移动到第一行的开始处

Esc >                   将光标移动到最后一行的结束处

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...