当前位置:编程学习 > wap >>

用Lua编写iOS程序

本文讨论用Lua创建iOS应用的3种方法。包括用Lua创建完整的应用(Corona)一直到用Lua作为app中的脚本元素(通过Wax或diy)。在此之前,我们需要问自己两个问题:

1、为什么要使用Lua?

2、苹果允许使用Lua吗?

这两个问题是紧密相关的。

如果你在此之前对Lua一无所知,我会简单介绍一下Lua。如果你熟悉Lua,则可以跳过这部分内容。

 

关于Lua

 

Lua是一个高效、轻量级、嵌入式脚本语言。类似Javascrip、Ruby或Python。有许多和我一样的使用者,都认为Lua是一种简洁优雅的语言。

Lua始于1993年巴西里约热内卢宗铎天主教大学的Roberto Ierusalimschy, Waldemar Celes 和Luiz Henrique de Figueiredo。它应用在Mi Casa Verde, Adobe Lightroom, Celestia, lighttpd,LuaTeX, nmap,Wireshark, 思科的Adaptive Security Appliance, pbLua,以及成千上万的游戏中(包括 Grim Fandango(神通鬼大),魔兽世界,Tap Tap Revenge(劲乐团)等)。Lua采用MIT协议——这意味着Lua基本无碍于商业和非商业目的。

Lua的主要数据构建机制是表——可变数组和哈希表的结合。列表1列出了一个Lua Table,假设我们用于描述汽车和它的每加仑行驶里程数。我们可以用字符串类型的键来储存车辆信息,如license和make。而采用数字下标索引的方式存储一系列的每加仑里程数。

 

列表 1: 一个 Lua Table类型

 

  car_data = { license = 'XVW1942', make = 'Volvo',                model = 'XC70',30, 31.3,32.4, 34.0}

   print(car_data[1])               -- 30

 print(car_data['license'])       -- XVW1942

print(car_data.license)          -- XVW1942 (also!)

 

在Lua中,数组下标从1开始,而不是0。'--'表示注释开始直至行末。让你想不到的是,Lua既不是面向对象的语言,也不是函数编程语言。但是,它也提供了几种机制允许你定制自己的高级特性。Lua中内包含了各种不同的对象系统如:传统OO系统和无类化OO系统(比如Oracle的Self语言和Io语言。译者注*  这两种都是基于范型的语言)。Lua支持“first class 函数”(译者注*其实是匿名函数, Lua可以在运行时随时构造出一个函数,并把它看作一个对象),闭包以及元特性(如元表和元方法)。Lua能很好地满足函数式编程的需要。

关于Lua 的面向对象编程的介绍,请阅读《Lua 编程》(这本书很好地介绍了Lua的方方面面)。你也应当阅读Luawiki上的Lua示例。

列表2列出了链表类的一种实现。变量List实际上是table,用作所有链表对象的元表。它实现了一种向后查找表索引的类似于类的事件处理机制。"List.__index=List"一行允许我们为List对象创建方法。方法是保存在List元表中的函数。当我们调用list对象的这些函数时,将在List元表中查找这些函数的定义并运行。

这段代码显示了Lua的一系列增强特性:多赋值(以及函数返回多个返回值),方法调用语法糖(':' 符号的作用,类似于在函数调用中增加了一个self参数,这在许多语言,从Python到OC都能见到)。

 

列表 2: Linked List 类

List = {}

List.__index = List

 

function List:new()

  local l = { head = {},tail = {}, size = 0 }

  l.head.__next,l.tail.__prev = l.tail, l.head

  return setmetatable(l,self)

end

 

function List:first()

  if self.size > 0 then

    returnself.head.next

  else

    return nil

  end

end

 

function List:addFirst(elem)

   local node = { prev= self.head, value = elem,

                       next = self.head.next }

   node.next.prev =node

   self.head.next =node

   self.size =self.size + 1

end

 

mylist = List:new()

mylist:addFirst(12)

print(mylist:first())

 

在这里,我忽略了一些重要的和有趣的东西(比如闭包)。但至少,你已经学到了一点Lua的皮毛。在后面我们进入iPhone编码的时候,会看到更多的Lua代码。更多关于Lua的介绍,请阅读这个网站。

 

iOS支持脚本吗?

 

正如本文开头列出的两个问题,尤其是第2个问题:“iPhone允许使用Lua(或其他解释型语言)吗?”毕竟,早在苹果的IDP许可协议中就已经阐明“只有苹果官方的API和内置解释器所支持的解释型代码能被下载或用于app中”。

事实上,本文的拟写大纲时,苹果已经改变了原来禁止开发者在app使用除OC和Javascript(Javascript能在web app或者本地 app中使用——通过UIWebView)以外的其他语言的条款(circa2010 四月)。最近(2010 九月),苹果再次改变了这个条款,允许使用脚本语言。

但仍然有几个重要的限制。更主要的是,虽然你可以使用Lua(及其它脚本语言),但你的app不能允许用户从web上下载插件(用过应用程序购买吗?),也不能允许用户编写脚本、下载脚本等。有大量的商店应用在使用Lua这样的语言(比如劲乐团)。

当然,在app中包含Lua这类语言的两个最为主要的作用,就是创建插件系统,让用户自己能够编写脚本。除此之外还有许多。

 

如何在iOS开发中使用Lua?

 

尽管你不能为终端用户创建一个插件系统,也不能让用户自己编写脚本,但你仍然能以一种插件的方式开发你的系统!这可以加快原型的开发速度,同时在下个版本中有助于添加新的功能。使用Lua还有另一种好处,它允许你进行“快速原型开发”(我最喜欢抱怨的一句话:不要闭门造车式地编程),缓解甚至不需要内存管理,允许更多的团队成员参与到开发中来(有许多Lua项目根本没有程序员在编写代码),应用程序优化更加轻松,提供更强劲的持久化机制。

简而言之,Lua节省了开发时间,降低了开发门槛。生活变得如此轻松愉快!假设你已经决定使用Lua,那么我们该如何做起呢?

 

Corona

 

 

Ansca Mobile公司的Corona允许你完全用Lua来开发iOS应用,以及Android应用。你可以用同样的源代码编译出iOS和Android程序。这正是Lua(实际上是Corona)为何如此吸引人的原因:跨平台。

列表3 是一个app的全部源代码。

 

列表3: Swirly Text 应用中的main.lua

 

local w, h = display.stageWidth, display.stageHeight

local dx, dy, dtheta = 5, 5, 5

 

 

local background = display.newRect(0, 0, w, h)

background:setFillColor(255, 255, 255)

 

 

local message = display.newText('Hello from Corona', w/2, h/2)

message:setTextColor(0, 0, 200)

 

 

local function update(event)

   local counter_spin =false

  message:translate(dx, dy)

  message:rotate(dtheta)

   if message.x > wor message.x < 0 then

      dx= -1 * dx

     counter_spin = true

   end

   if message.y > hor message.y < 0 then

      dy = -1 * dy

     counter_spin = true

   end

   if counter_spin then

     dtheta = -1 * dtheta

   end

end

 

 

Runtime:addEventListener('enterFrame', update)

 

Corona程序可以用任何文本编辑器开发——我用的是Emacs。所有Lua源代码中用到的资源(图片、声音、数据)必需放在同一个目录,Corona需要main.lua文件来启动app。可以在Corona模拟器中测试代码(支持Intel cpu和Power pc的Mac)。图1显示了我的corona IDE: Emacs(包含Lua文件出口和项目窗口)、Corona终端(可以从诊断中打印调试信息),以及Corona模拟器。

 

图 1: 我的 Corona 'IDE'

 

 

从左至右(反时针方向):Corona模拟器、Emacs的两个窗口(源代码窗口和项目目录窗口)、Corona 终端(输出调试信息)。

想要在物理硬件上运行程序,使用Corona 模拟器的Openfor Build命令。要以iOS编译,你应该提供一个Provisioning Profile(开发或部署)——没错,你并不需要IDP帐号——这两个文件随同app代码和资源一同上传到Ansca公司的服务器上,然后将编译结果返回给你。要以Android编译,你应当有适当的签名证书。

补充:移动开发 , IOS ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,