Xcode 6.1引入了另外一種以互動式的方式來體驗Swift的方法:Read Eval PrintLoop,簡稱REPL。那些對解釋型語言比較熟悉的開發者會對這個指令行的環境感到很惬意,更有經驗的開發者會發現很多新奇的特性。閑話少說,言歸正傳。要想使用REPL,請先啟動Terminal.app(該程式在/Applications/Utilities下面),如果你使用的OS X Yosemite系統,那麼請在視窗中輸入“swift”,如果你使用的是OS X Mavericks系統,那麼請在視窗中輸入“xcrun swift”。輸入完成之後,我們就進入了Swift REPL環境之中:
Welcome to Swift version 1.1(swift-600.0.20.0). Type :help for assistance. 1>
進入環境之後,你需要做的就是輸入Swift語句,REPL會馬上執行輸入的代碼。REPL系統會自動組裝表達式的結果,并将結果與輸入的語句一起展示出來。控制台以互動式會話的方式來展示結果:
1>”100”.toInt() $R0: Int? = 100 2> let name =”Katherine” name: String =”Katherine” 3>print(“Hello, (name)”) Hello, Katherine
注意,雖然并沒有明确地将第一行表達式的結果值賦給一個變量,但REPL還是為結果起了一個名字($R0)。你可以在後面的語句中通過這個名字使用它所代表的結果值:
Swift編譯器可以識别未輸入完整的代碼,并在需要的時候提示你要輸入完全。你的代碼甚至會像在Xcode裡面那樣自動縮進。比如,編寫一個函數:
5> functimesTwo() { 6.
後續行的提示是一個後面緊跟句号的行号,而非提示一條新語句的尖括号。通過這個提示,你一眼就能看出自己還需要完成一個代碼段。是以,你可以在還未完成的函數中繼續輸入剩下的代碼:
有三個需要注意的地方:第一,上面的第六行代碼在最開始的時候是縮進了的,但REPL在我們輸入了函數結束符(})之後自動取消了縮進;第二,這個函數引用了一個我們忘記聲明的變量(value),并且函數還缺少了傳回類型,是以,你需要将這兩個bug修複掉;第三,修複代碼問題永遠都不晚,即使你已經完成了整個函數的編寫。
多行曆史記錄(Multi-Line History)
當代碼被送出到編譯器的時候,它也同時被記錄在了REPL曆史中,這使得修正錯誤不再重要。如果你在未編寫完整的函數(就像上面的函數)的最後按下了Enter鍵,那麼此時你會看到如下提示資訊:
error:use of unresolved identifier ‘value’
就像很多系統(譯者注:如Linux)中已經實作的那樣,你可以通過在終端上使用向上箭頭來調用最近幾次所輸入的指令。REPL會将上面例子中的三行代碼完全找回,并且将光标放在最後面。現在,你可以繼續編寫代碼來修改之前犯下的錯誤。
REPL能夠在會話之間儲存成百上千的代碼段的曆史。每次你按下向上箭頭鍵的時候,終端上就會出現你更早一次所輸入的指令。每次按下向下箭頭鍵的時候,終端上就會出現你更近一次所輸入的指令。就像我們在下面讨論的那樣,在出現下一條具體的指令之前的空行會顯得非常的實用。
多行編輯(Multi-Line Editing)
雖然REPL的行為有點像傳統的行編輯器,但它仍然為處理像很多類或者函數聲明那樣的多行輸入提供了非常友善的特性。如上面的例子所示,在最後一行按下Enter鍵之前,你可以使用向上箭頭來将光标移動到聲明行,然後使用向左箭頭來将光标移動到左括号(()之後以完善參數清單:
輸入參數聲明,之後使用向右的箭頭來将光标移動到右括号())之後并添加傳回值類型:
這個時候,你不能按下Enter鍵以完成函數聲明,因為光标還在代碼塊的中間。如果在這裡按下Enter鍵,就會插入一個換行符。如果你試圖在一個函數或方法體中插入多餘的行,那麼這個換行符就會發揮作用,但是在這裡你隻是想轉到函數聲明的最後去。你可以快速地按向下箭頭兩次來實作你的願望,或者使用Emacs序列ESC >(escape鍵後跟一個尖括号)。在最後面一行的末尾按下Enter鍵會編譯剛聲明的函數,現在這個函數就可以被調用了:
8> timesTwo(21) $R2: (Int) = 42
表達式完成狀态的自動檢測意味着在大多數時候你可以隻是輸入代碼而REPL會幫你将語句補充完整。然而,有些時候,因為語句之間的互相依賴性,同時送出多個聲明是很有必要的。請看下面的代碼:
如果一行一行地輸入上面的代碼,會導緻當第三行代碼寫完的時候編譯第一個函數的代碼,這也會導緻如下報錯:
error:use of unresolved identifier ‘bar’
你可以在同一行代碼中聲明兩個函數來規避當你按下Enter鍵所發生的自動完成檢測。但是,還有更好的方法。當完成了上面的前三行的輸入之後,你可以按向下箭頭來手動生成第四行,然後正常輸入剩下的代碼。這兩個函數在一起被編譯,這樣就達到了互遞歸(兩個函數互相調用)的目的。
快速入門(Quick Reference)
為了讓大家快速邁出第一步,這裡提供一個最常使用的編輯和導航的快捷鍵清單: