坑1:NSString、NSMutableString与LuaString的自动转换
从OC中转到Lua中的String变量在Lua中不能直接调用NSString的方法,要先将LuaString转换为NSString对象。
示例:获取NSString的长度
local var = NSString:stringwithCString(“testString”)
local length = toobjc(var):length()
说明:toobjc是wax提供的工具,可以将Lua中的变量转换为相应的OC对象。
坑2:NSArray、NSDictionary与LuaTable的自动转换
同坑1。
如果在Lua中有local test1 = {}; test[1] = 0; test[2] = 0; 那么test1被传到oc时,会自动转换成NSArray。
如果在Lua中有local test2 = {}; test[“x”] = 0; test[“y”] = 0;那么test2被传到oc时,会自动转换成NSDictionary。
坑3:在OC中定义的宏无法在Lua中直接使用
如果我们想用那些宏,就得在Lua中重新声明。
如:
我们在OC中定义了字体大小的宏如图1
图1
如图2,则是在Lua中定义的相同的“宏”(26~34行)
图2
坑4:在OC中定义的enum(枚举)无法在Lua中直接使用,我们也得必须在Lua中重新定义。
如果你发现在使用系统的枚举时,能直接使用,告诉你,那是因为Wax已经为我们重新定义部分的OC枚举类型,可以去APP_ROOT/wax/lib/stdlib/enums.lua中查证。
另外,要说明的是stdlib中的所有lua文件都要被硬编码(转换成二进制后,新生成wax_stdlib.h文件)后才能被使用,而编码工具是APP_ROOT/wax/lib/build-scripts/compile-stdlib.sh,笔者尝试过使用,但一直失败,似乎失败的结果会很严重,所以笔者建议不要随便使用。
笔者采用的方法是自己新件一个lua文件,当然是资源的一部分,用的时候require(“…”)就好。
如:
在OC中定义一个枚举如图3:
图3
在Lua中则定义如图4中的(9~18行):
图4
坑5:在OC中的结构体也不能直接被Lua调用,也是要重新定义的。
像CGSize,CGPoint,CGRect… 这些OC自带的结构体,Wax已经帮我们生成好了,详见APP_ROOT/wax/lib/stdlib/structs.lua
如:
在OC中定义了如图5的结构体:
图5
在Lua中只要调用下Wax提供的一个方法就能轻易定义,如图6(第2行):
图6
说明:wax.struct.create表示要定义一个结构体,第一个参数表示结构体名称,第二个参数表示结构体中的成员个数与相应的类型,后面的参数个数要与成员个数相同,表示各成员变量名。
第二个参数的类型说明字符意义:f表示float,d表示double,I(大写i)表示int,C表示char,B表示BOOL。
有了这个,像要创建一个结构体变量,如_ccColor4B(1,1,1,1)即可,不要用ccc4这样的在OC里用宏定义的方法。
在图6中第2行为什么定义结构体的名称为_ccColor4B,而不是ccColor4B呢?如果你要在Lua中获得OC对象的该结构体的变量时,Lua会获取到_ccColor4B这个结构体名称,而不是ccColor4B,进而在注册的结构体列表中寻找相同的结构体名称,以完成从OC到Lua的转换。
----未完,待续----