概述
這是Wax框架的一個快速教程。通過本教程,最終你會明白在OC中使用Wax是多麼的有趣。
Wax是OC和Lua之間的黏合劑。也就是說,你可以在OC和Lua之間進行通信。
通過Wax,使用Lua訪問Cocoa類如同在OC中一樣簡單。
NSString -- 返回 NSString
UIView -- 返回 UIView
UITableView -- 下面這一行的“語法糖”
wax.class["UITableView"]-- Wax原生調用,你不必了解
當年你創建OC實例時,不需要使用alloc,Wax會為你這樣做。
-- 天啊,不需要alloc,retain 和 release了 !
local view = UIView.initWithFrame(CGRect(0, 0,100, 100))
用Lua創建OC類,使用函數waxClass{CLASS_NAME,PARENT_CLASS}。所有後續加入的函數(同一Lua文件中)都會自動添加為該類的實例方法。
waxClass{"MyClass",NSObject}
-- 聲明協議
waxClass{"MyClass",NSObject, protocols = {"UITableViewDelegate","UITableViewDataSource"}}
-- 注意!協議名是字符串形式(因為它們並不是類)REMEMBER!
調用Lua函數時,使用{}而不是()(看waxClass函數的調用)。這是用一個Lua表來傳遞參數的“語法糖”。
-- 等同於第2句
waxClass{"MyClass", NSObject}
-- 大括號可以忽略,等同於第1句
waxClass({"MyClass", NSObject}) -- ...omitting the parenthesis ismuch more pretty, so that's how we roll.
對於waxClass函數,第1個參數總是self,以便用Wax模擬除OC的面向對象模型。
waxClass{"MyClass",NSObject}
-- 注意函數第1個參數為self。這就持有了MyClass實例對象
functionstoreWords(self, words)
self.words = words
-- Wax在self對象中創建了一個'super'的成員變量
-- 以便調用父類方法
self.super:words(self)
end
使用冒號 : 代替點號 . 來調用OC方法。這將把調用者自身作為第1個參數傳給該方法。
--在Lua中,使用冒號 : 進行方法調用
UIApplication:sharedApplication()
--... 等同於
UIApplication.sharedApplication(UIApplication)
--使用冒號 : 是為了讓代碼變得簡單和可讀
如果OC 方法有多個參數,用下劃線 _ 代替冒號 : 。
在OC中
[UIAlertView initWithTitle:@"title"message:@"message" delegate:nil];
使用Wax
UIAlertView:initWithTitle_message_delegate("title","message", nil)
Wax不使用OC屬性。它強制Lua和OC只通過方法調用來通信
someView.frame -- 這樣不行
-- 只能用 getter/setter 方法
someView:frame()
someView:setFrame(someFrame)
通過點號. 可以為對象動態創建成員變量。不同於冒號 : (用於調用OC的類/實例方法),在 Lua 代碼中點 . 能夠動態創建成員變量(在對象的 OC 代碼中則完全不知道這些變量)。這些成員變量在對象生命周期中是有效的。
--在Lua中用冒號: 進行方法調用…
localview = UIView:init()
view.someRandomVariable= "YEAH!"
--你能把任何對象賦值給一個實例,它會一直存在
Wax視圖將OC對象轉換為Lua原始類型。反之亦然,如果OC方法有一個NSString參數,你直接傳遞一個Lua字符串給它。
local fileManager =NSFileManager:defaultManager()
local contents =fileManager:directoryContentsAtPath(".")
-- directoryContentsAtPath 返回一個 NSArray, 但 Wax 將之轉換為 Lua table
print(contents[1]) --> "info.plist"
-- NSDictionaries 變成 Lua tables
-- NSArrays 變成Lua tables
-- NSStrings 變成Lua strings
-- NSNumbers 變成Lua numbers
如果你不象OC對象被自動轉換,則可以使用toobjc方法。
-- 如果你這樣調用NSString的方法是不行的
local string = "astring"
string:capitalizedString()
-- 這是因為string已經被強制轉換為Luastring了
-- 使用toobjc,避免NSString被強制轉換為Luastring
toobjc(string):capitalizedString()
枚舉類型,比如UITableViewStylePlain,已經被硬編碼了。目前,大部分常用枚舉定義在APP_ROOT/wax/stdlib/enums.lua中。以後我希望在iPhone中使用橋接的方式以便枚舉和結構能動態創建。
要傳遞一個selector,直接使用字符串。例如在OC中,selector被寫成@selector(this:is:a:method),在Wax寫成this:is:a:method即可。
結構體也同枚舉一樣。最常用的結構體都聲明在APP_ROOT/wax/wax-scripts/structs.lua中。根據structs.lua文件中的模板很容易添加新的結構體。
wax.struct.create("CGRect","ffff", "x", "y", "width","height")
-- 創建一個全局函數叫做CGRect,帶有4個float參數
-- 第2個參數"ffff"定義了4個參數的類型
local rect = CGRect(1, 2, 3, 4)
print(rect.x) --> 1
rect.x = 200
print(rect.x) --> 200