####1.序言 這兩天一直忙,沒來得及記錄東西,週三12月4日凌晨1點多看到蘋果正式開源了Swift,國外各大媒體資訊動做超級快。我也興奮的起來看了一遍關於Swift開源的最新消息。衆所周知,蘋果平臺的Swift語言已經出來了一年半了,一直在成長,經歷了好幾個版本。許多人盼望的swift開源是但願能夠在除了蘋果平臺以外的平臺能夠運用這個新語言。好比有人但願未來能夠用swift也能夠擼一擼後臺開發之類,理論上是沒問題的,可是一樣也有人會噴這麼一個願景,可是開源一出後,多多少少社區人員會去往這個方面去努力的。蘋果官方爲swift新搞了個網站swift.org,也放出來了Ubuntu Linux平臺的預編譯好的swift工具鏈的打包文件以及Linux下的編譯指南。我今天寫這麼一博客的目的就是爲了介紹和推廣Swift語言在初學者或者低年級大學生羣體中的運用。linux
####2.Swift+Ubuntu環境配置 首先假定咱們已經安裝好Ubuntu Linux操做系統了,這個系統安裝很簡單,網上不少的步驟教程,虛擬機的話推薦用VirtualBox。Swift支持Ubuntu 14.04和15.10兩個髮型版,我這選擇15.10版本的包。c++
第一步:下載 Swift 2.2
工具鏈壓縮包,打開終端,輸入命令新建目錄並下載ubuntu
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
工具鏈壓縮包到當前目錄,並配置環境變量swift
先解壓,再進入目錄,目錄下會有usr/bin
和usr/lib
等等子目錄:bash
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
配置文件app
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終端從新打開終端就生效了。ide
####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