首頁 >php教程 >PHP开发 >Linux平台Swift語言開發學習環境搭建

Linux平台Swift語言開發學習環境搭建

高洛峰
高洛峰原創
2016-11-22 17:46:511408瀏覽

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/bin和usr/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終端機重新開啟終端就生效了。

搞過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相关的函数,程序照样可以运行,不管是脚本还是编译成二进制可执行文件,这个我以后再细说了。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:dlang操作mysql下一篇:dlang操作mysql