Wax简介

Wax是什么?

Wax是一个用Lua语言编写本地iPhone app的框架。它使用OC运行时将OCLua进行绑定。通过Wax,你可以用Lua做任何OC可以做到的事情。

Wax-lua的语言优势:

  1. 自动垃圾回收:再也不用使用allocretainrelease
  2. 代码少:没有头文件、没有static类型、array常量、dictionary常量
  3. 能够使用任何一个framework,例如cocoaUITouchFondation等,任何用oc写的frameworkwax自动将其暴露给lua使用
  4. 超级简单的http请求: 和RESTweb service一起交互使用
  5. lua支持函数闭包
  6. lua有内置的Regex-like 模式匹配library
  7. 64位支持
  8. 线程安全
  9. 其他一些特性:
    • Lua function 转化成 oc block
    • Lua中调用oc block
    • getting/setting 私有成员变量
    • 内置通用的C函数
    • 支持Lua代码debug

LuaMac OS 系统上安装

在终端执行如下命令:

curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install

Wax安装

GitHub下载:https://github.com/alibaba/wax

使用Cocoapods

pod 'wax', :git=>'https://github.com/alibaba/wax.git', :tag=>'1.2.1'

使用Static framework

  • 下载Wax, cd到项目的tools/Framework
  • 执行rake package 命令
  • 到项目的framework文件夹下找到wax.framework 拖到自己的项目中即可。

手动加入Lib

  • 下载Wax
  • Wax根目录找到lib文件夹并拖拽到自己的项目中。
  • TARGETS->Build Phases->Compile Sources加入-fno-objc-arc标志
  • 如想支持SQLite需添加libsqlite3,在Build Phases->Link Binary With Libraries.
  • 如需支持xml,需要添加libxml2Build Phases->Link Binary With Libraries 和添加${SDKROOT}/usr/include/libxml2Build settings->Head Search Path中。

语法

Wax语法介绍:https://github.com/alibaba/wax/wiki/Overview

1、注释:

通过--来注释
--注释的内容

wax 中新建对象:

waxClass{"MyClass", NSObject}

添加协议 
waxClass{"MyClass", NSObject, protocols = {"UITableViewDelegate", "UITableViewDataSource"}}

wax 中方法的参数,第一个默认必须是 self

这样,在该方法中,就可以通过 self 来调用一些东西。

waxClass{"MyClass", NSObject}

function storeWords(self, words)
  self.words = words
  self.super:words(self)
end

使用 冒号代替点.

OC

UIApplication:sharedApplication() 
UIApplication.sharedApplication(UIApplication)

oc 有多参数的方法中,通过使用 _ 下划线来代替

OC

[UIAlertView initWithTitle:@"title" message:@"message" delegate:nil];

LUA

UIAlertView:initWithTitle_message_delegate("title", "message", nil) 

wax 中不使用 oc 中的属性,wax强制要求使用方法来获取或者赋值

someView.frame -- 不会工作

//使用 setter/getter 来代替
someView:frame()
someView:setFrame(someFrame)

可以通过 . 的操作,来给对象赋值任何的值。

//方法通过 : 来获取
local view = UIView:init()

view.someRandomVariable = "YEAH!"
//可以赋任何值 并且该值持久存在

wax 会强制将 oc 的语法写成 lua 的语法。

即:一个方法的参数是 NSString 类型,那么,在 wax 中,应该传入的参数为 luastring

local fileManager = NSFileManager:defaultManager()

local contents = fileManager:directoryContentsAtPath(".")
//directoryContentsAtPath 返回一个数组,wax 中编程 table 类型

print(contents[1]) --> "info.plist"
  • NSDictionaries 成为 Lua 中的 tables
  • NSArrays 成为 Lua 中的 tables
  • NSStrings 成为 Lua 中的 strings
  • NSNumbers 成为 Lua 中的 numbers

如果需要将 wax 类型强制转换成为 oc 类型,可以使用 toobjc 这个方法

//如果尝试去调用 oc 的方法,这将会失败

local string = "a string"
string:capitalizedString()

//... 应该这个 string 已经被强制转为 lua 的 string

//使用 toobjc  ,string 会被转换为 NSString
toobjc(string):capitalizedString()

local length = toobjc(str):length();
if not toobjc(tempDeviceID):isEqualToString(self:deviceID()) then 
    --xx
end    

枚举:

系统定义的枚举都在 wax/stdlib/enums.lua 这个文件中

selector 使用 string 进行传递。

OC 中的写法

@selector(this:is:a:method)

lua 中写成

this:is:a:method   

如:

local backItem = UIBarButtonItem:alloc():initWithTitle_style_target_action("返回",UIBarButtonItemStylePlain,self,"backAction");
self:navigationItem():setLeftBarButtonItem(backItem);

32/64 可以使用 wax.isArm64 来判断当前 APP 运行的设备是否是64位cpu

Structs 大部分都定义好了,在 APP_ROOT/wax/wax-scripts/structs.lua 路径下面,不需要重新创建。特别注意 NSIntegerCGFloat ,它们在32/64位中的设备上,表现不一样。

在存在的对象中,hook 其中的一个存在方法,直接写该方法,就会覆盖掉 oc 中已经写好的方法 。 如果你想调用原来的方法 ,你可以在新的方法中,增加 ORIG 的前缀

waxClass{“MyController"}
function viewDidLoad(self)
//—做一些事情在原方法之前
self:ORIGviewDidLoad()--self is no need
//做一些事情在原方法之后
end

hook 一个扩展出来的方法

hook 一个对象中的方法类似

OC extension

```objc
@interface MTPServer (Async4j)

  • (void)startAsync4jRequest;
    @end
top Created with Sketch.