Linux下配置Swift开发环境和初步使用

不想干活了,整理一下如何在Linux下配置Swift的开发环境和初步的使用,如果你是圈内人你肯定清楚Swift,否则你会有疑问Swift是什么鬼,你以为我会在这里告诉你Swift的详细内容吗?就一句话Swift是Apple公司在2014年开发者大会上发布的一门新的开发语言(详细内容还是问谷哥或者点我吧或者戳我!)。

测试平台

Ubuntu15.10

搭建开发环境

安装相应依赖包和下载安装Swift包,做相应环境配置。

安装依赖包

swift的使用和开发会依赖clanglibicu-dev开发包,所以在使用Swift之前先安装一下,终端下执行命令安装即可:

$ sudo apt-get install clang libicu-dev

下载最新Swift包

点我可以跳转到下载页面,页面最顶部就是最新的发行包,其中格式为swift-<VERSION>-<PLATFORM>.tar.gz的文件便是Swift开发要用到的工具链,.sig文件是数字签名文件。

导入PGP密钥

如果是第一次下载Swift包,需要将导入GPG密钥导入到你的密钥环中,两种方式:

$ gpg --keyserver hkp://pool.sks-keyservers.net \
      --recv-keys \
      '7463 A81A 4B2E EA1B 551F  FBCF D441 C977 412B 37AD' \
      '1BE1 E29A 084C B305 F397  D62A 9F59 7F4D 21A5 6D5F'

或者

$ wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import -

验证GPG签名

linux的.tar.gz压缩包都是使用Swift开源项目的密钥通过GnuPG签名了的,苹果建议和鼓励每个将要使用Swift软件包的人都进行签名验证,此步可以省略(不验证不影响使用),但还是按照他们的建议进行验证吧。

更新密钥

首先,如果需要的话,可以更新密钥使原来的证书作废:

$ gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift

验证

然后,使用签名文件验证关联的Swift压缩包:

$ gpg --verify swift-<VERSION>-<PLATFORM>.tar.gz.sig
...
gpg: Good signature from "Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>"

如果验证失败,可能是因为没有公共密钥(gpg: Can't check signature: No public key),可以按照激活签名密钥的方法导入密钥。

不顺利的话,还有可能会看到一个警告,汗!!!:

gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.

这个警告说明在密钥与系统间没有可信的网络路径,只要是按照上面的步骤从可信的的来源获取的密钥,警告几乎没有影响。

解压压缩包

按照下面命令解压下载的压缩包,需要将下面命令中压缩包的名字改成下载的,解压后的文件目录里有usr/目录。

$ tar xzf swift-<VERSION>-<PLATFORM>.tar.gz

添加路径

需要将解压出来的Swift工具链添加到PATH变量里,可以执行下面的命令(**注:**需要将/path/to/换成解压后Swift工具链的目录):

$ export PATH=/path/to/usr/bin:"${PATH}"

激活签名密钥

Swift工程为开发版的使用一个密钥集,为每个官方发行版的提供独立的密钥,都是使用4096-bit RSA密钥。

下面是获取签名工具链密钥的两种方法:

  • Swift自动签名密钥 #1 <swift-infrastructure@swift.org>

    Download: https://swift.org/keys/automatic-signing-key-1.asc

    Fingerprint: 7463 A81A 4B2E EA1B 551F FBCF D441 C977 412B 37AD

    Long ID: D441C977412B37AD

    执行下面命令导入密钥:

    $ gpg --keyserver hkp://pool.sks-keyservers.net \
          --recv-keys \
        '7463 A81A 4B2E EA1B 551F  FBCF D441 C977 412B 37AD'
    

    或者:

    $ wget -q -O - https://swift.org/keys/automatic-signing-key-1.asc | gpg --import -
    
  • Swift 2.2 发行版签名密钥 <swift-infrastructure@swift.org>

    Download: https://swift.org/keys/release-key-swift-2.2.asc Fingerprint: 1BE1 E29A 084C B305 F397 D62A 9F59 7F4D 21A5 6D5F Long ID: 9F597F4D21A56D5F

    执行下面命令导入密钥:

    $ gpg --keyserver hkp://pool.sks-keyservers.net \
          --recv-keys \
        '1BE1 E29A 084C B305 F397  D62A 9F59 7F4D 21A5 6D5F'
    

    或者:

    $ wget -q -O - https://swift.org/keys/release-key-swift-2.2.asc | gpg --import -
    

使用REPL

如果在命令行中执行swift命令,就会启动REPL,它是一个可交互的Shell窗口,可以读取、计算和打印你所输入的Swift代码。

$ swift
Welcome to Apple Swift version 2.2. Type :help for assistance.
  1>

与REPL交互是探索Swift极好的方式,比如输入表达式1 + 2,敲回车便会计算出结果,3,在下一行中打印出来:

  1> 1 + 2
$R0: Int = 3

可以为变量和常量赋值,后续可以使用它们。比如将String类型的Hello, world!赋值给greeting常量,然后可以使用print(_:)函数进行打印:

  2> let greeting = "hello!"
greeting: String = "Hello!"
  3> print(greeting)
Hello!

如果输入一个无效的表达式,REPL会打印出错误并标明出错的位置,就像下面:

let answer = "fourty"-"two"
error: binary operator '-' cannot be applied to two 'String' operands
let answer = "fourty"-"two"
             ~~~~~~~~^~~~~~

可以使用UP键和DOWN键循环查看之前在REPL中输入过的文本行。这让你可以稍微修改过去输入过的文本而不用输入全部内容,比如对于修改上面例子中错误就很方便:

let answer = "fourty-two"
answer: String = "fourty-two"

REPL还有一个很有用的特性:在输入特定文本后可以提示函数和方法。比如,在一个String后输入re在按下TAB键,便会给出一个提示可用函数和方法的列表,就像下面那样:

5> "Hi!".re⇥
Available completions:
	removeAll() -> Void
	removeAll(keepCapacity: Bool) -> Void
	removeAtIndex(i: Index) -> Character
	removeRange(subRange: Range<Index>) -> Void
	replaceRange(subRange: Range<Index>, with: C) -> Void
	replaceRange(subRange: Range<Index>, with: String) -> Void
	reserveCapacity(n: Int) -> Void

当开始编写一个代码块的时候,比如用for-in轮询数组时,REPL会在下一行自动缩进,此时行首的提示符会由>变为.,表明代码还未输入完整需要输入完整后在进行评估:

  6> let numbers = [1,2,3]
numbers: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  7> for n in numbers.reverse() {
  8.     print(n)
  9. }
3
2
1

Swift的所有函数在REPL中都是可以调用的,从编写控制流到声明和实例化结构体和类都是可以的。另外可以导入可用的系统模块,比如OSX下的Darwin和Linux下的Glibc

OSX下:

1> import Darwin
2> arc4random_uniform(10)
$R0: UInt32 = 4

Linux下:

1> import Glibc
2> random() % 10
$R0: Int32 = 4

使用编译系统

Swift的编译系统可以用来编译库、可执行程序和在不同工程之间分享代码。

在官方文档中,使用swift build来讲解的,但我安装了Swift 2.2后发现按照他们的教程操作发现,竟然没有了swift build工具,简直想骂娘,但我还是忍住了,经过本菜鸟探索了一下,用swiftc可以用来编译生成可执行程序。

可以调用swift build --help来看一下,结果会有以下提示:

$ swift build --help
error: unable to invoke subcommand: /home/smslit/Applications/swift/usr/bin/swift-build (No such file or directory)

后来,我有重新安装了开发版的Swift,里面有build命令,所以如果用的是开发版的可以将下面的swiftc 换成swift build。

可以使用官方例程,来尝试一下swiftc,可以执行命令swiftc -h查看swiftc的使用方法。

创建代码包

  • 创建hello/Sources目录,并进入hello目录下:

    $ mkdir -p hello/Sources
    $ cd hello
    
  • 创建包管理文件Package.swift

    $ touch Package.swift
    

编辑代码

Sources目录下新建main.swift文件,并输入代码print("Hello, Monkey!")

$ touch Sources/main.swift
$ echo "print(\"Hello, Monkey!\")" > Sources/main.swift

编译生成可执行文件

使用swiftc进行编译,在包根目录下生成名为hello的可执行文件,使用swiftc命令的-o参数。

$ swiftc Sources/main.swift -o hello

测试执行

一切顺利的话,应该已经生成hello可执行文件,可以执行测试一下,正常的话应该是如下的结果:

$ ./hello
Hello, Monkey!

虽然已经学习过Swift语言的语法和规则,但实践很少,所以想在linux平台好进一步通过一定实践进一步学习swift,路慢慢其修远兮呀!