Lua编写iOS程序
2012-10-08 13:42:08 来源:WEB开发网DIY
很容易把Lua解释器放到iOS app中。打开一个Xcode项目把Lua的源文件(除lua.c和luac.c命令行程序外)加到项目中。编译。你就可以使用标准的LuaC API去创建一个解释起并运行源代码,就像 iLua所做的。你可以在 http://github.com/profburke/ilua下载这个示例代码。iLuaShell是一个简单的view-based application,它提供两个文本框给用户——一个给用户输入Lua代码,另一个是不可编辑的,仅仅是显示Lua代码计算的结果。
这个工作用evaluate方法完成,如列表5所示。在方法中首先获取第1个文本域的值,把它交给Lua解释器解析和执行,然后把Lua输出结果放到第2个文本域中。
列表 5 evaluate 方法
-(void)evaluate {
int err;
[input resignFirstResponder];
lua_settop(L, 0);
err = luaL_loadstring(L, [input.text
cStringUsingEncoding:NSASCIIStringEncoding]);
if (0 != err) {
output.text = [NSString stringWithCString:lua_tostring(L, -1)
encoding:NSASCIIStringEncoding];
lua_pop(L, 1);
return;
}
err = lua_pcall(L, 0, LUA_MULTRET, 0);
if (0 != err) {
output.text = [NSString stringWithCString:lua_tostring(L, -1)
encoding:NSASCIIStringEncoding];
lua_pop(L, 1);
return;
}
int nresults =lua_gettop(L);
if (0 == nresults) {
output.text = @"<no results>";
} else {
NSString *outputNS = [NSString string];
for(int i = nresults; i > 0; i--) {
outputNS = [outputNSstringByAppendingFormat:@"%s ",
lua_tostring(L, -1* i)];
}
lua_pop(L, nresults);
output.text = outputNS;
}
}
注意错误的捕捉和处理被极度简化了。一个好的Luashell应该要做得更多一些,并不是随随便便就可以往苹果商店中放的…
这样做的弊端在哪里?最大的问题是到OC的桥接丢失了。理想状态下我们应该从Lua中调用OC方法,以及相反方向的调用。Lua中要是能实现代码回调和委托方法就太爽了。
iPhone Wax
CoreyJohnson的iOS Wax最吸引人的地方是在Lua和OC间实现了相互调用。通过Wax,你能轻易用Lua继承一个OC类!列表6展示用扩Wax实现对viewController类的扩展。这段代码是DIY小节中提及的app的一部分。
列表 6:RootViewController.lua
waxClass{'RootViewController', UI.ViewController }
function init(self)
self.super:init()
self.input =UI.TextView:initWithFrame(CGRect(20, 20, 280, 114))
self.output =UI.TextView:initWithFrame(CGRect(20, 184, 280, 225))
localevalButton = UI.Button:buttonWithType(UIButtonTypeRoundedRect)
evalButton:setTitle_forState('Evaluate', UIControlStateNormal)
evalButton:setFrame(CGRect(200,142, 100, 32))
evalButton:addTarget_action_forControlEvents(self, 'eval:',
UIControlEventTouchUpInside)
self.evalButton = evalButton
self:view():addSubview(self.input)
self:view():addSubview(self.output)
self:view():addSubview(self.evalButton)
return self
end
function eval(self, sender)
self.input:resignFirstResponder()
local code,errmsg = loadstring(self.input:text())
if not codethen
self.output:setText(errmsg)
return
end
更多精彩
赞助商链接