Swift REPL简介

简介: 原文链接:https://developer.apple.com/swift/blog/?id=18Xcode 6.1引入了另外一种以交互式的方式来体验Swift的方法:Read Eval PrintLoop,简称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 >                   将光标移动到最后一行的结束处
目录
相关文章
|
编译器 Swift iOS开发
44 Swift和Objective-C的运行时简介
Swift和Objective-C的运行时简介
101 0
|
存储 安全 iOS开发
《Swift入门经典(第2版)》——2.3 数据类型简介
迄今为止,我们没有显式指出希望Swift为常量和变量使用的数据类型,并且不需要这样做。当没有显式声明数据类型时,Swift将使用所谓的类型推断(type inference)。Swift通过分析设置为常量或变量的值,相应地声明和设置类型。快速查看上一章中的示例,其中把40和2相加。
1479 0
|
安全 C# iOS开发
《Swift入门经典(第2版)》——第1章 Swift开发环境简介 1.1什么是Swift
Swift是由Apple自定义的一种编程语言,并且被视为“没有C的Objective-C”。的确,这在一定程度上是正确的。Swift不但借鉴了其他的语言(比如Haskell、Ruby、Python、C#及其他几种语言),而且在去年因为它自己的风格和方法而变得成熟起来。
2074 0
|
Swift
Swift游戏实战-跑酷熊猫(一) 简介 (含源代码)
原文:Swift游戏实战-跑酷熊猫(一) 简介 (含源代码)   优酷观看地址:http://v.youku.com/v_show/id_XNzM2Nzc2MTIw.html   通过这个小游戏,我们能够接触到物理系统(SKPhysicsBody,physicsWorld),动作(...
948 0
|
iOS开发
Swift简介
原文:Swift简介 1. swift初始来源     没有了解过swift可以先参考Brec Victor的Inventing on Principle ,Swift编程环境的大部分概念都源自于Brec这个演讲。
886 0
|
4月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
141 3
|
15天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
31 1