2025-02-10

概述

這是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

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *