不一样的开始
好吧,你打开这篇文章说明你对Swift有一定了解,我就不废话告诉你这是什么玩意了。
尽管Swift的“用武之地”主要是开发IOS或者macOS应用,但是它在Web开发方面也不逊色于传统的Web端开发语言,尽管性能与Golang等相比有一定差距,但是Swift的优势在于你可以学习一门语言就能完成从桌面端、移动端、服务器端的全部后端开发工作。当然桌面端和移动端仅限苹果产品。也就是说如果你的产品集中在苹果平台,Swift大概是个不二的选择。
除此之外让人想用Swift来开发Web端的另一个原因是Swift的语法让人感觉舒服。就开发效率来说,个人认为是可以媲美Python、Ruby的。
苹果平台安装Swift我就不废话了,Windows和Linux的话也是解压就能用,没什么好说的。
因为是教程,所以使用Docker安装不同版本的Swift,以便更好地控制版本,比较版本之间的差异。
运行 Swift 的 Docker 镜像
首先,我们需要Swift开发环境,本文使用Docker构建一个用于Swift简单开发的在线IDE(基于Cloud9 IDE)。
安装Docker不废话,一句话:
curl -sSL https://get.docker.com/ | sh
安装好Docker之后使用下面这句话就可以启动一个用于Swift开发的容器了。自己改用户名密码。
docker run -d -it --privileged=true --name=cloud9 -v ~/workspace:/root/workspace -p 8181:8181 zuolan/swift-ide --auth username:password
运行成功后的界面
如果你想自己构建一个镜像,这份 Dockerfile 可以在Github找到。
Dockerfile
FROM ubuntu:trusty
MAINTAINER ZuoLan <i@zuolan.me>
# If you use Swift package, may be need install libicu-dev, so you can use libicu-dev instead of libicu52.
ENV buildDeps="make build-essential g++ gcc curl ca-certificates git" c9Deps="nodejs" swiftDeps="curl python-dev libedit2 clang libicu52 libxml2"
# Install Cloud9-ide
RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y $buildDeps --no-install-recommends \
&& curl -sL https://deb.nodesource.com/setup_4.x | sudo bash - \
&& apt-get -y install $c9Deps $swiftDeps \
&& npm install -g forever && npm cache clean \
&& git clone https://github.com/c9/core.git /cloud9 && cd /cloud9 \
&& scripts/install-sdk.sh \
# Install Swift
&& cd /usr/local/ \
&& curl -o swift.tar.gz -sL https://swift.org/builds/swift-3.0-release/ubuntu1404/swift-3.0-RELEASE/swift-3.0-RELEASE-ubuntu14.04.tar.gz \
&& tar xzf swift.tar.gz && mv swift-3.0-RELEASE-ubuntu14.04 swift && rm /usr/local/swift.tar.gz \
&& echo 'export PATH=/usr/local/swift/usr/bin:"${PATH}"' >> ~/.bashrc \
&& apt-get autoremove -y $buildDeps \
&& apt-get autoremove -y && apt-get autoclean -y && apt-get clean -y \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
&& npm cache clean
VOLUME /root/workspace
ENV workspace /root/workspace
EXPOSE 8181
ENTRYPOINT ["forever", "/cloud9/server.js", "-w", "/root/workspace", "-l", "0.0.0.0"]
#CMD["--auth","username:password"]
使用包管理器
虽然是新手,但是基本的概念还是没问题的对吧?
$ mkdir swift # 新建一个文件夹
$ cd swift
$ swift package init # 初始化项目
$ tree # 看一下项目目录结构
.
|-- Package.swift
|-- Sources
| `-- swift.swift
`-- Tests
|-- LinuxMain.swift
`-- swiftTests
`-- swiftTests.swift
3 directories, 4 files
$ swift build # 构建项目
$ swift test # 测试项目
构建可执行文件
再新建一个项目吧!~
$ mkdir swift-ex # 新建一个文件夹
$ cd swift-ex
$ swift package init --type executable # 初始化项目
$ swift build
Creating executable package: swift-ex
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/
$ swift build
Compile Swift Module 'swift_ex' (1 sources)
Linking ./.build/debug/swift-ex
$ ./.build/debug/swift-ex # 执行可执行文件
Hello, world!
这样第一个Hello World项目就出来了。
使用多个源文件
再来一个多文件的项目,算熟悉一下这些工具吧,反正还没正式开始进入学习呢。
编辑一个文件:$ vi Greeter.swift
这里使用vi编辑器是因为在Linux环境下啊,教程基础部分都是在Linux下操作的,一个编辑器而已,不用在意。
文件内容:
func sayHello(name: String) {
print("Hello, \(name)!")
}
再编辑一个文件:$ vi main.swift
,内容如下:
if CommandLine.arguments.count != 2 {
print("Usage: hello NAME")
} else {
let name = CommandLine.arguments[1]
sayHello(name: name)
}
www(笑),现在就可以构建了,然后运行一下,第二个Hello World项目达成。
$ swift build
Compile Swift Module 'swift_ex' (2 sources)
Linking /root/workspace/swift-ex/.build/debug/swift-ex
$ /root/workspace/swift-ex/.build/debug/swift-ex zuolan
Hello, zuolan!
使用LLDB调试器
调试这个看看就好,以后还会遇到。
编辑文件:$ vi Factorial.swift
func factorial(n: Int) -> Int {
if n <= 1 { return n }
return n * factorial(n: n - 1)
}
let number = 4
print("\(number)! is equal to \(factorial(n: number))")
编译一下:
$ swiftc -g Factorial.swift
看一下文件目录结构:
~/workspace/swift-ex/Sources $ tree
.
|-- Factorial
|-- Factorial.swift
|-- Greeter.swift
`-- main.swift
0 directories, 4 files
关于更多LLDB的命令可以在 LLDB Tutorial 中查阅。
进入调试模式:
$ lldb Factorial
(lldb) target create "Factorial"
Current executable set to 'Factorial' (x86_64).
(lldb) b 2
Breakpoint 1: where = Factorial`Factorial.factorial (n : Swift.Int) -> Swift.Int + 12 at Factorial.swift:2, address = 0x00000000004010ac
(lldb) r
Process 1834 launched: '/root/workspace/swift-ex/Sources/Factorial' (x86_64)
Process 1834 stopped
* thread #1: tid = 1834, 0x00000000004010ac Factorial`factorial(n=4) -> Int + 12 at Factorial.swift:2, name = 'Factorial', stop reason = breakpoint 1.1
frame #0: 0x00000000004010ac Factorial`factorial(n=4) -> Int + 12 at Factorial.swift:2
1 func factorial(n: Int) -> Int {
-> 2 if n <= 1 { return n }
3 return n * factorial(n: n - 1)
4 }
5
6 let number = 4
7 print("\(number)! is equal to \(factorial(n: number))")
(lldb) p n
(Int) $R0 = 4
(lldb) p n * n
(Int) $R1 = 16
(lldb) bt
* thread #1: tid = 1834, 0x00000000004010ac Factorial`factorial(n=4) -> Int + 12 at Factorial.swift:2, name = 'Factorial', stop reason = breakpoint 1.1
* frame #0: 0x00000000004010ac Factorial`factorial(n=4) -> Int + 12 at Factorial.swift:2
frame #1: 0x0000000000400fda Factorial`main + 282 at Factorial.swift:7
frame #2: 0x00007ffff6e6bf45 libc.so.6`__libc_start_main + 245
frame #3: 0x0000000000400df9 Factorial`_start + 41
(lldb) c
Process 1834 resuming
Process 1834 stopped
* thread #1: tid = 1834, 0x00000000004010ac Factorial`factorial(n=3) -> Int + 12 at Factorial.swift:2, name = 'Factorial', stop reason = breakpoint 1.1
frame #0: 0x00000000004010ac Factorial`factorial(n=3) -> Int + 12 at Factorial.swift:2
1 func factorial(n: Int) -> Int {
-> 2 if n <= 1 { return n }
3 return n * factorial(n: n - 1)
4 }
5
6 let number = 4
7 print("\(number)! is equal to \(factorial(n: number))")
(lldb) p n
(Int) $R2 = 3
(lldb) br di
All breakpoints disabled. (1 breakpoints)
(lldb) c
Process 1834 resuming
4! is equal to 24
Process 1834 exited with status = 0 (0x00000000)
(lldb) ^D
~/workspace/swift-ex/Sources $
最后一部分没什么好看的,刚开始基本用不上。
网友评论