【51CTO獨家譯文】2011年6月的編程語言排行榜Lua語言一軍突起,一舉進入前十名。這與一年前蘋果決定在iOS系統上使用Lua語言密不可分。可是,你瞭解如何用Lua語言在iOS上開發應用嗎?51CTO將向各位介紹Lua語言的iOS應用開發框架——Wax,其中在iOS平臺上無比火爆的《憤怒的小鳥》就是由Lua語言用Wax開發的。全文共分兩部分,第一部分51CTO將帶您深刻探討Wax具備的一些好處,同時演示把Lua與Xcode 4和iOS軟件開發工具包(SDK)集成起來必不可少的實際步驟。第二部分51CTO將逐步介紹如何用Wax構建一個簡單的應用程序,顯示Twitter上的當前趨勢話題列表,能夠用按鈕來更新內容。git
Wax是什麼?程序員
Wax for iPhone這種框架在開發時,旨在把Lua腳本語言和原生Objective-C應用編程接口(API)結合起來。這意味着,你能夠從Lua裏面,使用任何和所有的Objective-C類及框架。github
從技術上來說,Wax結合了Objective-C類和原生C代碼。Lua語言嵌入了C語言,而後Objective-C類併入到其中。編程
爲何使用Wax?json
Wax是免費的、開源的。與其餘一些基於Lua的移動開發解決方案不一樣,Wax是個開源框架,只須要你花一點點時間就能夠上手,不須要花錢。不喜歡Wax的工做方式,或者發現實施方面的缺陷?源代碼可免費獲取,你老是能夠改動源代碼,以知足本身的須要。xcode
能夠利用原生API。這意味着,爲教Objective-C而編寫的教程很容易由Lua for Wax來改動和編寫。這還意味着,你的應用程序在外觀感受上老是如同原生應用程序,不過又獲得了用Lua這種高效腳本語言編寫代碼能夠節省時間的好處。app
可使用Xcode。這意味着,模擬器和設備部署都垂手可得,不會輕易與將來的iOS版本決裂。框架
能夠利用全部現有的Objective-C庫。若是你有一個Objective-C類是之前編寫的,不須要改動,就能夠將它用在Lua中——只要把它放入到Xcode。Three20之類的庫也是同樣。只要按照正常指令來添加庫,就可使用Lua代碼訪問它們。異步
能夠利用Wax Lua模塊。Wax有幾個內置的Lua模塊,使得異步HTTP請求和JavaScript對象標註(JSON)建立/解析極其容易而快速(由於模塊是用C編寫的)。編程語言
不必管理內存。再也不須要操心內存分配之類的事務。Wax爲你處理這一切。
Lua類型自動轉換成對應的Objective-C類型,反之亦然。 這意味着,若是你調用了須要NSString和NSInteger的某個方法,但傳送了Lua字符串和Lua整數,Wax會爲你搞定轉換工做。這種轉換功能強大,甚至能夠處理複雜的Objective-C特性,好比選擇器。
你能夠利用全部上述特性。不須要精挑細選。你得到全部特性!
OK,實在太棒了!我該如何安裝Wax?
首先你須要Xcode和iPhone SDK。要是你尚未這些東西,趕忙弄一份!
用Xcode建立項目
咱們先建立一個新的「基於Windows的項目」,名爲「WaxApplication」。別忘了把設備設置成iPhone:
經過Finder瀏覽到你保存該項目的文件夾。建立三個新的文件夾:wax、scripts和Classes。你的文件夾看起來應該像這樣:
設置Wax(第一部分,處理文件)
首先,下載源代碼的壓縮包。Wax放在GitHub上(https://github.com/probablycorey/wax),那樣下載源代碼就很容易。從這裏下載壓縮包。
如今,解壓縮剛下載的文件。瀏覽到剛解壓縮的文件夾。它會有「probablycorey-wax-124ca46」之類的名稱。
你的屏幕如今看起來應該像這樣:
如今,執行下列操做:
◆拷貝lib和bin文件夾,把它們粘貼到位於WaxApplication項目文件夾裏面的wax文件夾。
◆將xcode-template/Classes/ProtocolLoader.h拷貝到WaxApplication項目文件夾。
◆拷貝xcode-template/scripts/文件夾,將它放到WaxApplication項目文件夾裏面。
◆打開WaxApplication項目文件夾裏面的wax/lib/extensions/文件夾。刪除SQLite和xml文件夾,下圖所示:
你的屏幕應該看起來像這樣:
設置Wax(第二部分,配置項目)
如今用Finder選擇Classes、scripts和wax文件夾,把它們拖入到Xcode項目中。把它們放到顯示「Wax Application」和「1 target, iOS SDK X.X」的那個條下方。不要勾選顯示「Copy items into destination group’s folder(if needed)」的複選框。點擊完成。
如今點擊顯示「Wax Application」和「1 target, iOS SDK 4.3」的那個條。接着採起下列步驟:
◆在右邊窗格中,尋找「Targets」標題,點擊「WaxApplication」。點擊「Build Phases」(構建階段)選項卡。點擊「Copy Bundle Resources」(複製捆綁資源),清除全部lua文件。
◆在右下角,先點擊「Add Build Phase」(添加構建階段),再點擊「Add Run Script」(添加運行腳本)。
◆將Shell設成/bin/zsh
◆將Shell下面的文本區域設成「$PROJECT_DIR/wax/lib/build-scripts/copy-scripts.sh」。
你的屏幕如今看起來像這樣:
改動main.m
在左邊窗格中,打開名爲「WaxApplication」的文件夾。接下來,打開「Supporting Files」文件夾。接着,打開main.m,把文件的內容換成以下:
別忘了保存文件!
刪除沒必要要的文件
刪除MainWindow.xib、WaxApplicationAppDelegate.h和WaxApplicationAppDelegate.m三個文件。打開「WaxApplication/Supporting Files/WaxPallication-Info.plist」,而後刪除鍵是「Main nib file base name」的那一行。
測試安裝的Wax
按⌘↵(命令+回車鍵),或者按左上角的「Run」,就能夠在模擬器中運行應用程序。要是一切正常,你會看到一個簡單的應用程序會說「Hello Lua!」。
要是你沒看到這個消息,檢查以前的步驟,看看有沒有步驟漏了。
查看Lua
展開Scripts文件夾,打開AppDelegate.lua。你會看到運行該應用程序的Lua代碼。
你可能會先注意到,沒有語法高亮。遺憾的是,對於Xcode中的Lua語法高亮問題,我尚未發現穩定的解決方案(是你發現了,請留言告訴我!)。
接下來你可能會注意到,沒有方括號,不過使用了像UIScreen和UIWindow這些類。那是因爲你在使用Lua構建一個AppDelegate類;在蘋果和蘋果的代碼看來,你在使用Objective-C、構建Objective-C類!
方法名稱
你可能還注意到奇怪的方法名稱「colorWithRed_green_blue_alpha」。要是你熟悉Objective-C,就知道方法名稱能夠有冒號。Lua中的函數名稱不能有冒號。爲了補償這個差別,凡是Objective-C中隔開方法名稱的地方,在Lua中都換成下劃線。好比說:
Objective-C中的colorWithRed:green:blue:alpha對應於Lua中的colorWithRed_green_blue_alpha。
Objective-C 中的selectRowAtIndexPath:animated:scrollPosition:對應於Lua中的selectRowAtIndexPath_animated_scrollPosition
面向對象的模型
Lua的另外一個問題是,它沒有像Objective-C那樣的繼承體系。Lua中根本沒有類。爲了克服這個問題,Wax突出顯示了放在每一個Wax Lua文件最前面的一個函數:waxClass。在默認的AppDelegate.lua中,這一行看起來像這樣:
想經過Lua建立一個Objective-C類,就要使用waxClass{「CLASS NAME」, 「PARENT_CLASS」}這個函數。你添加到該Lua文件的全部以後的函數(在同一個文件裏面)都會做爲實例方法,自動添加到新的類。
AppDelegate.lua的這一行顯示,還能夠定義你的「類」定義哪些協議。
雖然waxClass解決了定義Objective-C可使用的類這個問題,但仍是存在一個問題:因爲Lua沒有類,它沒有像Objective-C那樣的動態「自」變量。爲了克服這個問題,Wax自動將每一個方法的第一個變量做爲類的當前實例。你能夠發現,當你查看AppDelegate.lua中的「applicationDidFinishLaunching」時,第一個變量是「自」變量,即便Objective-C版的這個方法只有1個變量。然而,若是你非得將類的當前實例做爲每一個方法的第一個變量來傳送,就會很煩人,因而添加了一些語法上的便利(syntactical sugar)。不是使用「.」操做符在Lua中進行「方法」調用,而是使用了「:」操做符:
--如下如出一轍
值得一提的另外一個重要方面是,Wax不支持Objective-C屬性。Wax迫使Lua和Objective-C只與方法進行聯繫。
-- 這不行
-- 你而是須要使用getter/setter方法
只用於Lua的變量
你可使用點.操做符,爲任何Objective-C對象建立成員變量。不像冒號:操做符(用於對Objective-C類/實例調用方法),點.操做符能夠針對對象的Lua方面,動態建立成員變量(對象的Objective-C方面對這些變量一無所知)。在對象的生命週期以內,均可以使用成員變量。
輸出到控制檯
AppDelegate.lua還顯示了你如何能夠編寫調試文本、輸出到控制檯。你可使用函數「puts」。
內存管理
我以前說過,使用Lua的話,你根本不必分配、保留和釋放內存。你在調用任何初始化器以前,根本不須要調用內存分配。實際上,若是你這麼作的話,程序可能會出現內存泄漏。
太棒了!接下來作什麼?
你已經深刻了解了專門針對Wax的Lua的基本知識,就能夠準備編寫iPhone應用程序了!
在這個教程的第二個部分,咱們將只用幾行Lua,就能夠編寫出擁有刷新按鈕的一個Twitter示例應用程序。
看完這個教程是否是你也有信心打造出本身的《憤怒的小鳥》呢?
小貼士
Lua程序設計語言 是一個簡潔、輕量、可擴展的腳本語言。Lua讀做/'lua/(嚕啊),是葡萄牙語中"Luna"(月亮)的意思。
Lua是一種輕量語言,它的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啓動速度快。它用標準C語言編寫並以源代碼形式開放,編譯後僅僅一百餘K,能夠很方便的嵌入別的程式裏。和許多"大而全"的語言不同,網路通信、圖形界面等都沒有默認提供。可是Lua能夠很容易地被擴展:由宿主語言(一般是C或C++)提供這些功能,Lua可使用它們,就像是原本就內置的功能同樣。事實上,如今已經有不少成熟的擴展模塊可供選用。
Lua的目標是成爲一個很容易嵌入其它語言中使用的語言。大多數程序員也認爲它的確作到了這一點。
不少應用程序使用Lua做爲本身的嵌入式腳本語言,以此來實現可配置性、可擴展性。這其中包括大話西遊II、仙境傳說、魔獸世界、戰錘40k、博德之門、軒轅劍外傳漢之雲等,在移動領域最著名的即是《憤怒的小鳥》。