使用Wax时的坑与解决方案(一)

坑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

wps_clip_image-17663_thumb

图1

如图2,则是在Lua中定义的相同的“宏”(26~34行)

wps_clip_image-587_thumb

图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:

wps_clip_image-11375_thumb

图3

在Lua中则定义如图4中的(9~18行):

wps_clip_image-20895_thumb

图4

坑5:在OC中的结构体也不能直接被Lua调用,也是要重新定义的。

像CGSize,CGPoint,CGRect… 这些OC自带的结构体,Wax已经帮我们生成好了,详见APP_ROOT/wax/lib/stdlib/structs.lua

如:

在OC中定义了如图5的结构体:

wps_clip_image-23082_thumb

图5

在Lua中只要调用下Wax提供的一个方法就能轻易定义,如图6(第2行):

wps_clip_image-28517_thumb

图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的转换。

 

----未完,待续----

你可能感兴趣的:(解决方案)