iOS中调用Lua1

340 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

最近项目中提到需要调用Lua,所以简单的研究了一下,也看了不少网上大佬的文章,在这就简单的写一下收获吧。

下载和编译Lua解析器

首先,跳转到Lua官网的下载页将源码下载下来。然后解压下载包可以得到如下图所示的目录结构:

image.png

Lua源码目录结构

对应的目录说明如下表:

名称说明
docLua相关的文档,包括了编译文档、接口文档等
Makefile编译Lua使用,在这里我们不使用它来进行编译
README关于Lua的说明文件
srcLua的源码文件

编译Lua源码

在这里我们只需要src目录中的源码文件,先打开src目录,将Makefile、lua.c、luac.c三个文件删除掉,需要说明的是lua.c和luac.c文件是用于编译生成lua和luac两个命令不属于解析器的功能,如果不删除可能会导致XCode无法编译通过。

接下来打开XCode创建一个新的项目并把src目录拖入项目中。如下图所示:

image.png

导入Lua源码到项目

然后Command+B进行编译,提示编译成功!

接下来就是实际操作:

From OC to Lua

1 空值传递

使用lua_pushnil方法可以将任意一个Lua变量置空。如:

lua_pushnil();
lua_setglobal(self.state, "val");

2 数值的传递

使用lua_pushinteger或者lua_pushnumber方法来将OC中的数值类型传递到Lua中指定的某个变量。如:

//传递整型值
lua_pushinteger(self.state, 1024);
lua_setglobal(self.state, "intVal");

//传递浮点型
lua_pushnumber(self.state, 80.08);
lua_setglobal(self.state, "numVal");

3 布尔值的传递

使用lua_pushboolean方法来实现,如:

lua_pushboolean(self.state, YES);
lua_setglobal(self.state, "boolVal");

4 字符串的传递

使用lua_pushstring方法可以传递字符串给Lua,要注意的是该方法接收的是一个c描述的字符串(即 char*)。如:

lua_pushstring(self.state, @"Hello World".UTF8String);
lua_setglobal(self.state, "stringVal");

5 二进制数组的传递

二进制数组在Lua中其实与字符串的存储方式相同,但是OC中不能直接使用lua_pushstring来进行二进制数组的传递,可以使用lua_pushlstring方法来传递。如:

char bytes[13] = {0xf1, 0xaa, 0x12, 0x56, 0x00, 0xb2, 0x43, '\0', '\0', 0x00, 0x90, 0x65, 0x73};
lua_pushlstring(self.state, bytes, 13);
lua_setglobal(self.state, "bytesVal");