2011年6月的编程语言排行榜中,Lua语言异军突起,一举进入前十名。这与一年前苹果决定在iOS系统上使用Lua语言密不可分。但是,你知道如何使用Lua语言在iOS上开发应用程序吗?我给大家介绍一下Lua语言的iOS应用开发框架——Wax。其中,在iOS平台上极其流行的《愤怒的小鸟》就是使用Lua语言和Wax开发的。全文分为两部分。第一部分将带您深入了解Wax 的一些优点,同时演示将Lua 与Xcode 4 和iOS 软件开发工具包(SDK) 集成所需的实际步骤。第二部分将引导您了解如何使用Wax 构建一个简单的应用程序,该应用程序显示Twitter 上当前趋势主题的列表,并可以使用按钮更新内容。
什么是蜡?
Wax for iPhone 框架的开发将Lua 脚本语言与本机Objective-C 应用程序编程接口(API) 相结合。这意味着您可以在Lua 中使用任何和所有Objective-C 类和框架。
从技术上讲,Wax 结合了Objective-C 类和本机C 代码。 Lua语言嵌入到C语言中,然后将Objective-C类合并到其中。
为什么要使用蜡?
Wax 是免费且开源的。与其他一些基于Lua 的移动开发解决方案不同,Wax 是一个开源框架,只需要一点时间即可上手,而且不需要花钱。不喜欢Wax 的工作方式,或者发现实施中的缺陷?源代码是免费提供的,您可以随时修改它以满足您的需要。
可以利用本机API。这意味着为教授Objective-C 而编写的教程可以轻松地改编并用Lua for Wax 编写。这也意味着您的应用程序在外观和感觉上始终像本机应用程序,但通过使用Lua 等高效脚本语言编写代码可以节省时间。
您可以使用Xcode。这意味着模拟器和设备部署都是轻而易举的,并且不会因未来的iOS 版本而中断。
可以利用所有现有的Objective-C 库。如果你有一个以前写过的Objective-C 类并且不需要修改,你可以在Lua —— 中使用它,只需将它放入Xcode 中即可。对于像Three20 这样的库来说也是如此。只需按照正常说明添加库,您就可以使用Lua 代码访问它们。
您可以利用Wax Lua 模块。 Wax 有几个内置的Lua 模块,可以使异步HTTP 请求和JavaScript 对象表示法(JSON) 创建/解析变得非常简单和快速(因为这些模块是用C 编写的)。
无需管理内存。不再担心内存分配之类的事情。蜡为您处理这一切。
Lua 类型会自动转换为相应的Objective-C 类型,反之亦然。这意味着,如果您调用需要NSString 和NSInteger 的方法,但传递Lua 字符串和Lua 整数,Wax 将为您完成转换。这种转换非常强大,甚至可以处理复杂的Objective-C 功能,例如选择器。
您可以利用以上所有功能。无需挑剔。您将获得所有功能!
#p#字幕#e#
太好了!如何安装蜡?
首先您需要Xcode 和iPhone SDK。如果您还没有这些,请立即购买!
使用Xcode 创建项目
让我们首先创建一个名为“WaxApplication”的新“基于Windows 的项目”。不要忘记将设备设置为iPhone:
通过Finder 浏览到保存项目的文件夹。创建三个新文件夹:wax、scripts 和Classes。您的文件夹应如下所示:
设置Wax(第1 部分,处理文件)
首先,下载源码压缩包。 Wax 在GitHub () 上,因此下载源代码很容易。从这里下载zip 包。
现在,解压缩刚刚下载的文件。浏览到您刚刚解压缩的文件夹。它的名称类似于“可能是corey-wax-124ca46”。
您的屏幕现在应该如下所示:
现在,执行以下操作:
复制lib 和bin 文件夹并将它们粘贴到位于WaxApplication 项目文件夹中的wax 文件夹中。
将xcode-template/Classes/ProtocolLoader.h复制到WaxApplication项目文件夹中。
复制xcode-template/scripts/文件夹并将其放入WaxApplication项目文件夹中。
打开WaxApplication 项目文件夹中的wax/lib/extensions/文件夹。删除SQLite和xml文件夹,如下图:
您的屏幕应如下所示:
设置蜡(第2 部分,配置项目)
现在使用Finder 选择Classes、scripts 和Wax 文件夹并将它们拖到Xcode 项目中。将它们放在“Wax 应用程序”和“1 个目标,iOS SDK X.X”栏下方。取消选中“将项目复制到目标组的文件夹(如果需要)”框。单击“完成”。
现在单击“Wax 应用程序”和“1 个目标,iOS SDK 4.3”栏。然后执行以下步骤:
在右侧窗格中,查找“目标”标题并单击“WaxApplication”。单击“构建阶段”选项卡。点击“复制捆绑资源”即可清除所有lua文件。
在右下角,先单击“添加构建阶段”,然后单击“添加运行脚本”。
将Shell设置为/bin/zsh
将Shell下的文本区域设置为“$PROJECT_DIR/wax/lib/build-scripts/copy-scripts.sh”。
您的屏幕现在看起来像这样:
更改main.m
在左窗格中,打开名为“WaxApplication”的文件夹。接下来,打开“支持文件”文件夹。接下来,打开main.m 并将文件内容更改为以下内容: //这就是神奇发生的地方! //Wax不使用nib文件加载主视图,一切都在AppDelegate.lua文件中完成#importUIKit/UIKit.h#import'wax.h'#import'wax_http.h'#import'wax_json.h' # import 'wax_filesystem.h'wordintmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];wax_start('AppDelegate.lua',luaopen_wax_http,luaopen_wax_json,luaopen_wax_filesystem,nil);intretVal=UIApplicationMain( argc ,argv,nil,@'AppDelegate');[poolrelease];returnretVal;}
不要忘记保存文件!
删除不需要的文件
删除MainWindow.xib、WaxApplicationAppDelegate.h和WaxApplicationAppDelegate.m这三个文件。打开“WaxApplication/Supporting Files/WaxPallication-Info.plist”并删除键为“Main nib file base name”的行。
#p#字幕#e#
蜡试装
按(Command + Enter 键),或按左上角的“运行”以在模拟器中运行应用程序。如果一切顺利,您将看到一个简单的应用程序,上面写着“Hello Lua!”。
如果您没有看到此消息,请检查前面的步骤,看看是否遗漏了任何步骤。
查看Lua
展开Scripts 文件夹并打开AppDelegate.lua。您将看到运行该应用程序的Lua 代码。
您可能注意到的第一件事是没有语法突出显示。不幸的是,我还没有找到解决Xcode中Lua语法高亮问题的稳定解决方案(如果你找到了,请留言告诉我!)。
接下来您可能会注意到,没有方括号,但使用了UIScreen 和UIWindow 等类。那是因为你使用Lua 来构建AppDelegate 类;对于Apple 和Apple 的代码,您正在使用Objective-C 构建Objective-C 类!
方法名称
您可能还注意到奇怪的方法名称“colorWithRed_green_blue_alpha”。如果您熟悉Objective-C,您就会知道方法名称可以包含冒号。 Lua 中的函数名不能有冒号。为了弥补这种差异,在Objective-C 中凡是分隔方法名称的地方,在Lua 中都用下划线替换。例如:
Objective-C 中的colorWithRed:green:blue:alpha 对应于Lua 中的colorWithRed_green_blue_alpha 。
Objective-C 中的selectRowAtIndexPath:animated:scrollPosition对应Lua 中的selectRowAtIndexPath_animated_scrollPosition
面向对象模型
Lua的另一个问题是它没有像Objective-C那样的继承系统。 Lua 中根本没有类。为了克服这个问题,Wax 突出显示了每个Wax Lua 文件前面的一个函数:waxClass。在默认的AppDelegate.lua 中,这一行如下所示:waxClass{'AppDelegate',protocols={'UIApplicationDelegate'}}
如果你想通过Lua创建一个Objective-C类,你必须使用waxClass{"CLASS NAME", "PARENT_CLASS"}函数。您添加到Lua 文件(在同一文件中)的所有后续函数都将作为实例方法自动添加到新类中。
AppDelegate.lua 中的这一行表明您还可以定义您的“类”定义的协议。
虽然waxClass解决了定义Objective-C可以使用的类的问题,但是仍然存在一个问题:由于Lua没有类,所以它不像Objective-C那样有动态的“self”变量。为了克服这个问题,Wax 自动将每个方法的第一个变量设置为类的当前实例。你可以发现,当你查看AppDelegate.lua 中的“applicationDidFinishLaunching”时,第一个变量是“self”变量,尽管该方法的Objective-C 版本只有1 个变量。但是,如果您必须将类的当前实例作为每个方法中的第一个变量传递,那会很烦人,因此添加了一些语法糖。而不是使用“.”运算符在Lua中进行“方法”调用,使用“:”运算符: localview=UIView.initWithFrame(CGRect(0,0,100,100))
--下面的视图完全一样:addSubview(someView)iew.addSubview(view,someView)
另一个值得一提的重要方面是Wax 不支持Objective-C 属性。 Wax 强制Lua 和Objective-C 仅与方法交互。
-- 这不起作用someView.frame
-- 相反,您需要使用getter/setter 方法View:frame()someView:setFrame(someFrame)
仅适用于Lua 的变量
您可以使用点。运算符为任何Objective-C 对象创建成员变量。与冒号: 运算符(用于调用Objective-C 类/实例上的方法)不同,点.操作符可以为对象的Lua端动态创建成员变量(对象的Objective-C端对这些变量一无所知)。成员变量可以在对象的生命周期内使用。
输出到控制台
AppDelegate.lua 还展示了如何编写调试文本并将其输出到控制台。您可以使用“puts”功能。
内存管理
我之前说过,使用Lua 你根本不需要分配、保留和释放内存。在调用任何初始化程序之前,您根本不需要调用内存分配。事实上,如果你这样做,你的程序可能会泄漏内存。
伟大的!下一步是什么?
现在您已经对专门用于Wax 的Lua 基础知识有了深入的了解,您就可以编写iPhone 应用程序了!
在本教程的第二部分中,我们将仅使用几行Lua 编写一个带有刷新按钮的Twitter 示例应用程序。
读完本教程后,您有信心打造属于自己的“愤怒的小鸟”吗?
尖端
Lua编程语言是一种简洁、轻量级、可扩展的脚本语言。 Lua 发音为/'lua/,在葡萄牙语中意为“Luna”(月亮)。
Lua是一种轻量级语言,其官方版本仅包含精简的核心和最基本的库。这使得Lua体积小,启动快。它是用标准C语言编写的,并以源代码形式开放。编译后仅花费100K多,并且可以轻松嵌入到其他程序中。与许多“大而全面”的语言不同,默认情况下不提供网络通信、图形界面等。但是Lua可以很容易地扩展:宿主语言(通常是C或C++)提供了这些函数,Lua可以像使用内置函数一样使用它们。事实上,已经有很多成熟的扩展模块可用。
Lua的目标是成为一种可以轻松嵌入其他语言的语言。大多数程序员都同意它是这样做的。
许多应用程序使用Lua 作为嵌入式脚本语言来实现可配置性和可扩展性。其中包括大话西游2、仙境传说、魔兽世界、战锤40k、博德之门、轩辕剑之汉云等,移动领域最著名的就是《愤怒的小鸟》。
#p#字幕#e#