Идея, лежащая в основе Wax Framework, проста: все, что может сделать Objective-C, может сделать и Lua! Существует множество веских причин для создания собственных приложений iPhone с простым и эффективным языком сценариев, таких как Lua, и эта серия учебных пособий расскажет о преимуществах, предлагаемых Wax, а также продемонстрирует практические шаги, необходимые для интеграции Lua с Xcode 4 и iOS. SDK.
Что такое воск?
Wax for iPhone — это фреймворк, созданный таким образом, чтобы связать язык сценариев Lua и нативный API Objective-C. Это означает, что вы можете использовать любые классы и платформы Objective-C из Lua.
С технической точки зрения, Wax — это комбинация классов Objective-C и нативного кода на языке C. Язык Lua встроен в C, а затем классы Objective-C объединяются в микс.
Зачем использовать воск?
Воск бесплатный и с открытым исходным кодом . В отличие от некоторых других решений на основе Lua для разработки мобильных приложений, Wax — это платформа с открытым исходным кодом, которая требует лишь немного времени для работы, а не денег. Не нравится, как работает Wax или вы нашли ошибку в реализации? Исходный код находится в свободном доступе, и вы всегда можете изменить его в соответствии со своими потребностями.
Вы можете использовать собственные API . Это означает, что учебные пособия, написанные для обучения Objective-C, могут быть легко адаптированы и написаны с Lua для Wax. Это также означает, что ваше приложение всегда будет выглядеть и чувствовать себя нативно, но вы все равно сможете сэкономить время, написав свой код на Lua, эффективном языке сценариев.
Вы можете использовать Xcode . Это означает, что развертывание как симулятора, так и устройства является несложным делом и не должно легко сломаться в будущем выпуске iOS.
Вы можете использовать все существующие библиотеки Objective-C . Если у вас есть класс Objective-C, который вы написали ранее, вы можете использовать его в Lua — без каких-либо адаптаций — вы просто добавляете его в Xcode. То же самое относится и к библиотекам вроде Three20. Просто добавьте их в соответствии с обычными инструкциями, и у вас есть доступ к ним в вашем коде Lua.
Вы можете использовать модули Wax Lua . В Wax есть несколько встроенных модулей Lua, которые делают асинхронные HTTP-запросы и создание / анализ JSON невероятно легкими и быстрыми (потому что модули написаны на C).
Вам не нужно управлять памятью . Нет больше выделения памяти и тому подобное. Воск обрабатывает все это для вас.
Типы Lua автоматически конвертируются в эквиваленты Objective-C и наоборот . Это означает, что когда вы вызываете метод, которому требуется NSString и NSInteger, но вы передаете строку Lua и целое число Lua, об этом позаботится Wax. Это преобразование даже достаточно мощное, чтобы обрабатывать сложные функции Objective C, такие как селекторы.
Вы можете использовать ВСЕ из вышеперечисленного . Нет необходимости выбирать. Вы получаете все это!
Ладно, это круто! Как мне установить Wax?
Ну, во-первых, вам нужен Xcode и iPhone SDK. Если у вас их еще нет, иди за ними!
Создание проекта в Xcode
Давайте начнем с создания нового «оконного проекта» под названием «WaxApplication». Не забудьте установить устройство на iPhone:
Перейдите в папку, где вы сохранили этот проект в Finder. Создайте три новые папки: воск, сценарии и классы. Ваша папка должна выглядеть так:
Настройка Wax (часть 1, манипуляции с файлами)
Сначала скачайте zip исходного кода. Воск размещен на GitHub, что делает загрузку исходного кода очень простой. Загрузите почтовый индекс отсюда .
Теперь разархивируйте только что загруженный файл. Перейдите к недавно извлеченной папке. Это будет называться что-то вроде «вероятно-Корея-воск-124ca46».
Теперь ваш экран должен выглядеть так:
Теперь выполните следующие действия:
- Скопируйте папку lib и bin и вставьте их в папку wax, расположенную в папке проекта WaxApplication.
- Скопируйте xcode-template / Classes / ProtocolLoader.h в папку проекта WaxApplication.
- Скопируйте папку xcode-template / scripts / и поместите ее в папку проекта WaxApplication.
- Откройте папку wax / lib / extensions / в папке проекта WaxApplication. Удалите папку SQLite & xml, изображенную ниже:
Ваш экран должен выглядеть так:
Настройка Wax (часть 2, настройка проекта)
Теперь выберите классы, сценарии и восковые папки в Finder и перетащите их в проект Xcode. Перетащите их прямо под панель с надписью «Wax Application» и «1 target, iOS SDK XX». Снимите флажок «Копировать элементы в папку целевой группы (при необходимости)». Нажмите готово.
Теперь нажмите на строку с надписью «Wax Application» и «1 target, iOS SDK 4.3». Теперь сделайте следующие шаги:
- В правой панели найдите заголовок «Targets» и нажмите «WaxApplication». Перейдите на вкладку «Этапы сборки». Нажмите «Копировать Bundle Resources» и удалите все файлы lua.
- В правом нижнем углу нажмите «Добавить этап сборки», затем «Добавить сценарий запуска»
- Установите для Shell значение / bin / zsh
- Задайте для текстовой области под Shell значение «» $ PROJECT_DIR / wax / lib / build-scripts / copy-scripts.sh «»
Теперь ваш экран должен выглядеть так:
Модификация main.m
В левой панели откройте папку «WaxApplication». Затем откройте папку «Вспомогательные файлы». Затем откройте main.m и замените содержимое файла следующим:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
// This where the magic happens!
// Wax doesn’t use nibs to load the main view, everything is done within the
// AppDelegate.lua file
#import <UIKit/UIKit.h>
#import «wax.h»
#import «wax_http.h»
#import «wax_json.h»
#import «wax_filesystem.h»
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
wax_start(«AppDelegate.lua», luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil);
int retVal = UIApplicationMain(argc, argv, nil, @»AppDelegate»);
[pool release];
return retVal;
}
|
Не забудьте сохранить файл!
Удаление ненужных файлов
Удалите файлы MainWindow.xib, WaxApplicationAppDelegate.h и WaxApplicationAppDelegate.m. Откройте «WaxApplication / Supporting Files / WaxPallication-Info.plist», а затем удалите строку, где ключом является «Основное имя файла основного пера».
Тестирование вашей восковой установки
Нажмите ⌘↵ (Command + Enter) или нажмите «Выполнить» в верхнем левом углу, чтобы запустить приложение в симуляторе. Если все работает, вы увидите простое приложение с надписью «Привет, Луа!».
Если вы не видите это сообщение, просмотрите предыдущие шаги и посмотрите, пропустили ли вы шаг.
Глядя на Луа
Разверните коллекцию Scripts и откройте AppDelegate.lua. Теперь вы видите код Lua, который поддерживает это приложение.
Первое, что вы, вероятно, заметите, это отсутствие подсветки синтаксиса. К сожалению, я не нашел стабильного решения для подсветки синтаксиса Lua в XCode (но если вы его найдете, пожалуйста, оставьте его в комментариях!).
Второе, что вы, вероятно, заметите, это отсутствие квадратных скобок, но используются такие классы, как UIScreen и UIWindow. Это потому, что вы создаете класс AppDelegate в Lua, и, насколько Apple и код Apple могут сказать, вы используете Objective-C и создаете классы Objective-C!
Имена методов
Вы также можете заметить странное имя метода «colorWithRed_green_blue_alpha». Если вы знакомы с Objective-C, вы будете знать, что имена методов могут иметь двоеточия. Вы не можете иметь двоеточия в именах функций в Lua. Чтобы компенсировать эту разницу, в любом месте имя метода разбито в Objective-C, в Lua есть подчеркивание. Например:
- colorWithRed: зеленый: синий: альфа в Objective-C — это colorWithRed_green_blue_alpha в Lua
- selectRowAtIndexPath: animated: scrollPosition: в Objective-C есть selectRowAtIndexPath_animated_scrollPosition в Lua.
Объектно-ориентированная модель
Другая проблема с Lua заключается в том, что у него нет системы наследования, такой как Objective-C. В Lua вообще нет уроков. Чтобы обойти эту проблему, Wax предоставляет функцию, которая идет вверху каждого файла Wax Lua: waxClass. В AppDelegate.lua по умолчанию строка выглядит так:
1
|
waxClass{«AppDelegate», protocols = {«UIApplicationDelegate»}}
|
Для создания класса Objective-C из Lua используется функция waxClass {«CLASS NAME», «PARENT_CLASS»}. Все последующие функции (в том же файле), которые вы добавляете в этот файл Lua, будут автоматически добавляться в ваш новый класс как методы экземпляра.
Как показывает строка из AppDelegate.lua, вы также можете определить, какие протоколы определяет ваш «класс».
Хотя waxClass решает проблему определения классов для использования в Objective-C, все еще существует проблема, заключающаяся в том, что, поскольку Lua не имеет классов, у него нет динамической переменной «self», такой как Objective-C. Чтобы обойти это, Wax автоматически делает первый аргумент каждого метода текущим экземпляром класса. Когда вы смотрите на «applicationDidFinishLaunching» в AppDelegate.lua, вы можете видеть, что первым аргументом является «self», событие, хотя версия этого метода для Objective C имеет только 1 аргумент. Однако было бы очень неприятно, если бы вы передавали текущий экземпляр класса в качестве первого аргумента каждому методу, поэтому был добавлен некоторый синтаксический сахар. Вместо вызова метода в Lua, используя «.» оператор, оператор «двоеточие» используется:
1
2
3
4
5
|
local view = UIView.initWithFrame(CGRect(0, 0, 100, 100))
— the following are exactly the same
view:addSubview(someView)
view.addSubview(view, someView)
|
Еще одна важная вещь, которую стоит отметить, это то, что Wax не поддерживает свойства Objective-C. Воск заставляет Lua и Objective-C общаться только методами.
1
2
3
4
5
|
— This WILL NOT work.
someView.frame
— You want to use the getter/setter methods instead
someView:frame()
someView:setFrame(someFrame)
|
Переменные только для Lua
Вы можете динамически создавать переменные-члены для любого объекта Objective-C, используя точку. оператор. В отличие от оператора двоеточия: (используется для вызова методов в классе / экземпляре Objective C) точка. Оператор динамически создает переменные-члены на стороне объекта Lua (сторона объекта Objective-C не знает об этих переменных). Переменные-члены доступны в течение всего времени существования объекта.
Вывод на консоль
AppDelegate.lua также показывает, как вы можете записать отладочный текст в консоль. Вы используете функцию «ставит».
Управление памятью
Если вы помните, я обещал, что вам никогда не придется выделять, удерживать и освобождать вместе с Луа. Вам никогда не нужно вызывать alloc до вызова любого из инициализаторов. Фактически, если вы это сделаете, ваша программа, вероятно, будет иметь утечку памяти.
Потрясающие! Что дальше?
Теперь, когда вы хорошо разбираетесь в основах специфичного для воска Lua, вы готовы написать приложение для iPhone!
Во второй части этого руководства мы создадим пример приложения для Twitter с кнопкой обновления, используя всего несколько строк Lua.