Linux平台Swift语言开发学习环境搭建
Linux平台Swift语言开发学习环境搭建
大茶园丁 发表于2年前
Linux平台Swift语言开发学习环境搭建
  • 发表于 2年前
  • 阅读 8287
  • 收藏 185
  • 点赞 18
  • 评论 47

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 介绍在Ubuntu平台搭建Swift开发环境; 介绍Swift脚本解析器swift的使用; 介绍swift编译器swiftc的使用;

####1.序言 这两天一直忙,没来得及记录东西,周三12月4日凌晨1点多看到苹果正式开源了Swift,国外各大媒体资讯动作超级快。我也兴奋的起来看了一遍关于Swift开源的最新消息。众所周知,苹果平台的Swift语言已经出来了一年半了,一直在成长,经历了好几个版本。许多人盼望的swift开源是希望可以在除了苹果平台之外的平台可以运用这个新语言。比如有人希望将来可以用swift也可以撸一撸后台开发之类,理论上是没问题的,但是同样也有人会喷这么一个愿景,但是开源一出后,多多少少社区人员会去往这个方面去努力的。苹果官方为swift新搞了个网站swift.org,也放出来了Ubuntu Linux平台的预编译好的swift工具链的打包文件以及Linux下的编译指南。我今天写这么一博客的目的就是为了介绍和推广Swift语言在初学者或者低年级大学生群体中的运用。

####2.Swift+Ubuntu环境配置 首先假定我们已经安装好Ubuntu Linux操作系统了,这个系统安装很简单,网上很多的步骤教程,虚拟机的话推荐用VirtualBox。Swift支持Ubuntu 14.04和15.10两个发型版,我这选择15.10版本的包。

第一步:下载 Swift 2.2 工具链压缩包,打开终端,输入命令新建目录并下载

diveinedu@diveinedu-VirtualBox:~$ mkdir swift && cd swift;
diveinedu@diveinedu-VirtualBox:~/swift$ wget https://swift.org/builds/ubuntu1510/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu15.10.tar.gz

第二步:用tar命令解压 Swift 2.2 工具链压缩包到当前目录,并配置环境变量

先解压,再进入目录,目录下会有usr/binusr/lib等等子目录:

diveinedu@diveinedu-VirtualBox:~/swift$ tar xvf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu15.10.tar.gz
diveinedu@diveinedu-VirtualBox:~/swift$ cd swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu15.10/

然后配置用户级别的环境变量,编辑$HOME/.bashrc配置文件

diveinedu@diveinedu-VirtualBox:~/swift/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu15.10$ gedit $HOME/.bashrc

上面命令会调出图形界面文本编辑器GEdit来编辑这个配置文件,在文件的最后输入如下配置行并保存退出编辑器

export SWIFT_HOME=$HOME/swift/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu15.10
export PATH=$SWIFT_HOME/usr/bin:$PATH
export LD_LIBRARY_PATH=$SWIFT_HOME/usr/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$SWIFT_HOME/usr/lib:$LIBRARY_PATH

这样环境变量就配置OK啦。这个时候我们只需要关闭我们的Shell终端重新打开终端就生效了。

####3.Swift+Ubuntu初次体验 搞过iOS开发的都知道,2014年6月Swift刚出世时就随Xcode带了Playground功能,可以边写边看运行结果,辣么在Ubuntu Linux下有没有类似的呢,也有,只是没那么强大的IDE支持,我们一样可以运行类似Pyhton脚本解析器一样的Swift解析器,同步输入Swift代码来“解析”运行。这个命令就是swift,在上面的环境变量设置完后重开终端就可以直接使用了,如下所示。

diveinedu@diveinedu-VirtualBox:~$ swift
Welcome to Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c). Type :help for assistance.
  1> let hello = "hello";
hello: String = "hello"
  2> let world = "diveinedu"
world: String = "diveinedu"
  3> let space = " "
space: String = " "
  4> print(hello+space+world);
hello diveinedu
  5>hello.
Available completions:
	append(c: Character) -> Void
	append(x: UnicodeScalar) -> Void
	appendContentsOf(newElements: S) -> Void
	appendContentsOf(other: String) -> Void
	characters: String.CharacterView
	debugDescription: String
	endIndex: Index
	hashValue: Int
	insert(newElement: Character, atIndex: Index) -> Void
	insertContentsOf(newElements: S, at: Index) -> Void
	isEmpty: Bool
	lowercaseString: String
	nulTerminatedUTF8: ContiguousArray<CodeUnit>
	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
	startIndex: Index
	unicodeScalars: String.UnicodeScalarView
	uppercaseString: String
	utf16: String.UTF16View
	utf8: String.UTF8View
	withCString(f: UnsafePointer<Int8> throws -> ResultUnsafePointer<Int8> throws -> Result) -> Result
	withMutableCharacters(body: (inout String.CharacterView) -> R(inout String.CharacterView) -> R) -> R
	write(other: String) -> Void
	writeTo(&target: Target) -> Void
  6> hello.isEmpty
$R0: Bool = false

在这个解析执行界面还有自动提示补全功能!简直四国矣.上面第五行是输入hello后再输入一点.然后按tab键,一下就出来这么多关于字符串的方法,妈妈再也不担心我在终端模式下不记得方法名了。

上面这特简单的几行代码还没包含类和对象,下面看看在swift解析器中直接输入类的定义和对象创建和简单使用。

diveinedu@diveinedu-VirtualBox:~$ swift
Welcome to Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c). Type :help for assistance.
  1> struct Resolution {
  2.     var width = 0
  3.     var height = 0
  4. }
  5. class VideoMode {
  6.     var resolution = Resolution()
  7.     var interlaced = false
  8.     var frameRate = 0.0
  9.     var name: String?
 10.     func description()
 11.     {
 12.       print("name:\(name) frameRate:\(frameRate)")
 13.     }
 14. }
 15> let mode = VideoMode()
mode: VideoMode = {
  resolution = {
    width = 0
    height = 0
  }
  interlaced = false
  frameRate = 0
  name = nil
}
 16> mode.name = "1080p HD"
 17> mode.frameRate = 30.0
 18> mode.description()
name:Optional("1080p HD") frameRate:30.0
 19>

这些都只是在swift解析器中临时性的运行一些代码,如果我们需要新建.swift格式文件然后编译成可执行二进制文件形式又要怎样做呢,同样很简单,我们可以用swiftc这个命令来编译。 我们可以新建一个目录来存放swift代码文件,然后编辑一个test.swift

diveinedu@diveinedu-VirtualBox:~$ mkdir -p $HOME/swift/swiftcode
diveinedu@diveinedu-VirtualBox:~$ cd  $HOME/swift/swiftcode
diveinedu@diveinedu-VirtualBox:~/swift/swiftcode$ gedit test.swift

当打开gedit文本编辑器后,输入上面的类和对象创建以及方法调用的代码,列出在下面

struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
    func description()
    {
      print("name:\(name) frameRate:\(frameRate)")
    }
}
let mode = VideoMode()
mode.name = "1080p HD"
mode.frameRate = 30.0
mode.description()

保存后关闭编辑器,然后执行swiftc test.swift来编译源文件,会出现如下链接错误:

diveinedu@diveinedu-VirtualBox:~/swift/swiftcode$ swiftc test.swift
<unknown>:0: error: link command failed with exit code 127 (use -v to see invocation)
diveinedu@diveinedu-VirtualBox:~/swift/swiftcode$

解决办法是安装编译依赖clang libicu-dev,输入下面命令回车(会询问当前用户密码)

diveinedu@diveinedu-VirtualBox:~/swift/swiftcode$ sudo apt-get install clang libicu-dev

安装完成后再次执行编译命令swiftc test.swift就顺利编译成功,再当前目录下输出test可执行文件。

diveinedu@diveinedu-VirtualBox:~/swift/swiftcode$ swiftc test.swift
diveinedu@diveinedu-VirtualBox:~/swift/swiftcode$ ./test
name:Optional("1080p HD") frameRate:30.0

而且执行ldd ./test查看此二进制文件依赖的动态库可知,它链接了libswiftCore,这是所有swift程序都会需要的。

diveinedu@diveinedu-VirtualBox:~/swift/swiftcode$ ldd ./test
	linux-vdso.so.1 =>  (0x00007ffcef3f5000)
	libswiftCore.so => /home/diveinedu/swift/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu15.10/usr/lib/swift/linux/libswiftCore.so (0x00007f1cd2f75000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1cd2bdd000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1cd28d5000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1cd26be000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1cd22f3000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1cd20d5000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1cd1ed1000)
	libicuuc.so.55 => /usr/lib/x86_64-linux-gnu/libicuuc.so.55 (0x00007f1cd1b3c000)
	libicui18n.so.55 => /usr/lib/x86_64-linux-gnu/libicui18n.so.55 (0x00007f1cd16d9000)
	libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f1cd14c9000)
	/lib64/ld-linux-x86-64.so.2 (0x0000556e488b7000)
	libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55 (0x00007f1ccfa11000)

细心的读者会发现好像不见main函数或者main相关的函数,程序照样可以运行,不管是脚本还是编译成二进制可执行文件,这个我以后再细说了。

The Swift Programming Language 2.2

TheSwiftProgrammingLanguage(Swift2.2)

共有 人打赏支持
粉丝 57
博文 15
码字总数 21159
评论 (47)
Dragonite
哇塞,学习学习0
六月是你的谎言
教练,我想学IOS。。。
neo-chen
跟go 比怎么样?
霡霂
是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。
Raynor1

引用来自“霡霂”的评论

是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。
是呀 。他对所有的linux平台都是通用的。。
Raynor1

引用来自“neo-chen”的评论

跟go 比怎么样?
比go高级多了。你用了就知道。。感觉就像你用android手机和用苹果手机的感觉。。
人生能绕几个圈

引用来自“霡霂”的评论

是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。

引用来自“Raynor1”的评论

是呀 。他对所有的linux平台都是通用的。。
给力啊,在Linux下就能开发ios应用了,呵呵
大茶园丁

引用来自“Raynor1”的评论

引用来自“霡霂”的评论

是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。
是呀 。他对所有的linux平台都是通用的。。

我在ubuntu和debian上OK
OSC首席键客
这swift结尾不也没有分号吗?怎么没人吐槽?
Raynor1

引用来自“霡霂”的评论

是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。

引用来自“Raynor1”的评论

是呀 。他对所有的linux平台都是通用的。。

引用来自“人生想绕几个圈”的评论

给力啊,在Linux下就能开发ios应用了,呵呵
是呀 。我看到苹果能开源这么一个项目。真的太赞了哦。。瞬间觉得苹果高大上啊。。
海淀游民

引用来自“霡霂”的评论

是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。

引用来自“Raynor1”的评论

是呀 。他对所有的linux平台都是通用的。。

引用来自“人生想绕几个圈”的评论

给力啊,在Linux下就能开发ios应用了,呵呵

引用来自“Raynor1”的评论

是呀 。我看到苹果能开源这么一个项目。真的太赞了哦。。瞬间觉得苹果高大上啊。。
苹果有非常多的开源项目,很多大家天天用不知道而已,苹果不太像谷歌用开源做宣传噱头
大茶园丁

引用来自“霡霂”的评论

是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。

引用来自“Raynor1”的评论

是呀 。他对所有的linux平台都是通用的。。

引用来自“人生想绕几个圈”的评论

给力啊,在Linux下就能开发ios应用了,呵呵
并不能。
大茶园丁

引用来自“霡霂”的评论

是对所有Linux平台通用吗,那个 苹果官网本身就有Ubuntu的环境搭建。

引用来自“Raynor1”的评论

是呀 。他对所有的linux平台都是通用的。。

引用来自“人生想绕几个圈”的评论

给力啊,在Linux下就能开发ios应用了,呵呵

引用来自“Raynor1”的评论

是呀 。我看到苹果能开源这么一个项目。真的太赞了哦。。瞬间觉得苹果高大上啊。。

引用来自“海淀游民”的评论

苹果有非常多的开源项目,很多大家天天用不知道而已,苹果不太像谷歌用开源做宣传噱头
对头,Apple受益于开源社区,贡献于开源社区。从内核到编译器工具链,到浏览器内核Webkit,,,,太多了。
大茶园丁

引用来自“进击de程序员”的评论

教练,我想学IOS。。。
去戴维营度假学习iOS
欢欢0919
教练我想打iOS
大茶园丁

引用来自“欢欢0919”的评论

教练我想打iOS
你有苹果手机不。买这个锤子砸它就是打iOS了
lanmingle
先等等吧。
榕树下_
什么时候能在Linux下开发ios
大茶园丁

引用来自“榕树下_”的评论

什么时候能在Linux下开发ios
不要有这样的想法,swift和iOS关系并不大,iOS的App严重依赖苹果的上层框架,这是不会开源出来的。
jxpxwh
这么快就回来了。果然是开源的力量强大。
×
大茶园丁
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: