Native iOS-apps bouwen met wax introductie

Het idee achter het Wax-raamwerk is eenvoudig: alles wat Objective-C kan doen, kan Lua ook! Er zijn veel goede redenen om te overwegen om native iPhone-applicaties te maken met een eenvoudige en efficiënte scripttaal zoals Lua, en deze tutorialserie zal ingaan op de voordelen die Wax biedt, terwijl hij de praktische stappen demonstreert die nodig zijn om Lua te integreren met Xcode 4 en de iOS SDK.

Wat is Wax?

Wax voor iPhone is een framework dat is geschreven op een manier die de Lua-scriptingtaal en de native Objective-C API's overbrugt. Dit betekent dat je alle klassen en kaders van Objective-C vanuit Lua kunt gebruiken.

In technische termen is Wax een combinatie van Objective-C-klassen en native, C-code. De Lua-taal is ingebed in C en de Objective-C-klassen zijn samengevoegd in de mix.

Waarom Wax gebruiken?

Wax is gratis en open-source. In tegenstelling tot sommige andere op Lua gebaseerde oplossingen voor mobiele ontwikkeling, is Wax een open-source framework dat je alleen een beetje tijd nodig hebt om te werken, niet om geld te verdienen. Hou je niet van de manier waarop Wax werkt of vind je een fout in de implementatie? De broncode is vrij beschikbaar en u kunt deze altijd aanpassen aan uw behoeften.

Jij kan gebruik maken van native API's. Dit betekent dat tutorials geschreven om les te geven in Objective-C eenvoudig kunnen worden aangepast en geschreven met Lua for Wax. Dit betekent ook dat uw app er altijd in eigen land uit zal zien en voelen, maar toch heeft u nog steeds het tijdbesparende voordeel van het schrijven van uw code in Lua, een efficiënte scripttaal.

Jij mag gebruik Xcode. Dit betekent dat zowel de implementatie van de simulator als het apparaat in een handomdraai is en niet gemakkelijk moet breken met een toekomstige iOS-release.

Jij mag gebruik maken van alle bestaande Objective-C-bibliotheken. Als je een Objective-C-klasse hebt die je eerder hebt geschreven, kun je deze in Lua gebruiken - zonder aanpassingen - je gooit hem gewoon in Xcode. Hetzelfde geldt voor bibliotheken als Three20. Voeg ze toe volgens de normale instructies en je hebt toegang tot deze in je Lua-code.

Jij mag gebruik maken van Wax Lua-modules. Wax heeft een paar ingebouwde Lua-modules die asynchrone HTTP-verzoeken maken en JSON-creatie / parsing ongelooflijk gemakkelijk en snel (omdat de modules in C zijn geschreven).

U hoef het geheugen niet te beheren. Geen geheugentoewijzing meer en dergelijke. Wax verwerkt dat alles voor u.

Luatypes worden automatisch geconverteerd naar Objective-C-equivalenten en omgekeerd. Dit betekent dat wanneer je een methode aanroept die een NSString en een NSInteger nodig heeft, maar je een Lua-string en een Lua-integer doorgeeft, Wax het voor je zal regelen. Deze conversie is zelfs krachtig genoeg om complexe Objective-C-functies, zoals selectors, aan te kunnen.

Jij mag maak gebruik van AL het bovenstaande. Niet nodig om te kiezen en kiezen. Je krijgt alles!

Oké, dit is geweldig! Hoe installeer ik Wax?

Nou, eerst heb je Xcode en de iPhone SDK nodig. Als je die nog niet hebt, haal ze dan!

Het project maken in Xcode

Laten we beginnen met het maken van een nieuw "Window-gebaseerd project" genaamd "WaxApplication". Vergeet niet om het apparaat op iPhone in te stellen:

Navigeer naar de map waarin u dit project in Finder hebt opgeslagen. Maak drie nieuwe mappen: wax, scripts en klassen. Uw map zou er als volgt uit moeten zien:

Wax instellen (deel 1, bestandsmanipulaties)

Download eerst een zip van de broncode. Wax wordt gehost op GitHub, dus dat maakt het downloaden van de broncode heel gemakkelijk. Download de zip hier vandaan.

Pak het nieuw gedownloade bestand nu uit. Navigeer naar de nieuw uitgepakte map. Het zal zoiets als "waarschijnlijkcorey-wax-124ca46" worden genoemd.

Uw scherm zou er nu als volgt uit moeten zien:

Voer nu de volgende acties uit:

  • Kopieer de lib en de bin-map en plak ze in de wasmap die zich in de WaxApplication-projectmap bevindt.
  • Kopieer xcode-template / Classes / ProtocolLoader.h naar de WaxApplication-projectmap.
  • Kopieer de xcode-sjabloon / scripts / map en plaats deze in uw WaxApplication-projectmap.
  • Open de map wax / lib / extensions / in de WaxApplication-projectmap. Verwijder de map SQLite & xml hieronder afgebeeld:

Uw scherm zou er als volgt uit moeten zien:

Wax instellen (deel 2, configuratie van het project)

Selecteer nu de klassen Klassen, scripts en was in Finder en sleep ze naar het Xcode-project. Zet ze neer onder de balk met de tekst "Wax Application" en "1 target, iOS SDK X.X". Verwijder het vinkje uit het selectievakje "Items in de map van de bestemmingsgroep kopiëren (indien nodig)". Klik op voltooien.

Klik nu op de balk met de tekst "Wax Application" en "1 target, iOS SDK 4.3". Voer nu de volgende stappen uit:

  • Zoek in het rechterdeelvenster naar de kop "Targets" en klik op "WaxApplication". Klik op het tabblad 'Fasen opbouwen'. Klik op "Bundelbronnen kopiëren" en verwijder alle lua-bestanden.
  • Klik in de rechter benedenhoek op "Add Build Phase" en vervolgens "Run Script toevoegen"
  • Stel Shell in op / bin / zsh
  • Stel het tekstgebied onder Shell in op "" $ PROJECT_DIR / wax / lib / build-scripts / copy-scripts.sh ""

Uw scherm zou er nu als volgt uit moeten zien:

Hoofdm. wijzigen

In het linkerpaneel opent u de map met de naam "WaxApplication". Open vervolgens de map "Ondersteunende bestanden". Open vervolgens main.m en vervang de inhoud van het bestand door dit:

 // Dit is waar de magie gebeurt! // Wax gebruikt geen punten om de hoofdweergave te laden, alles wordt gedaan in het // AppDelegate.lua-bestand #import  #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] in het]; wax_start ("AppDelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nihil); int retVal = UIApplicationMain (argc, argv, nil, @ "AppDelegate"); [poolvrijgave]; retVal retourneren; 

Vergeet niet om het bestand op te slaan!

Onnodige bestanden verwijderen

Verwijder de bestanden MainWindow.xib, WaxApplicationAppDelegate.h en WaxApplicationAppDelegate.m. Open "WaxApplication / Supporting Files / WaxPallication-Info.plist" en verwijder vervolgens de regel waar de sleutel "Main nib file base name" is.

Je wasinstallatie testen

Druk op ?? (Command + Enter) of druk op? Uitvoeren? in de linkerbovenhoek om de app in de simulator uit te voeren. Als alles werkte, ziet u een eenvoudige app die zegt: "Hallo Lua!".

Als u dit bericht niet ziet, bekijkt u de vorige stappen om te zien of u een stap hebt gemist.

Kijkend naar de Lua

Vouw de Scripts-verzameling uit en open AppDelegate.lua. Je ziet nu de Lua-code die deze app van stroom voorziet.

Het eerste dat u waarschijnlijk zult opvallen, is dat er geen syntaxisaccentuering is. Helaas heb ik geen stabiele oplossing gevonden voor het markeren van Lua-syntaxis in Xcode (maar als je er een vindt, plaats er dan een in de reacties!).

Het tweede dat je waarschijnlijk zal opvallen, is dat er geen rechte haken zijn, maar dat klassen zoals UIScreen en UIWindow worden gebruikt. Dit komt omdat je een AppDelegate-klasse maakt in Lua, en voor zover de code van Apple en Apple het vertelt, gebruik je Objective-C en maak je Objective-C-klassen!

Methode namen

U kunt ook de oneven methode naam "colorWithRed_green_blue_alpha" opmerken. Als u bekend bent met Objective-C, weet u dat de naam van methoden dubbele punten kan hebben. U kunt geen dubbele punten in functienamen in Lua hebben. Om dit verschil te compenseren, wordt op elke plaats een methode-naam onderverdeeld in Objective-C, in Lua heeft een onderstrepingsteken. Bijvoorbeeld:

  • colorWithRed: groen: blauw: alpha in Objective-C isяcolorWithRed_green_blue_alpha in Lua
  • selectRowAtIndexPath: geanimeerd: scrollPosition: in Objective-C is selectRowAtIndexPath_animated_scrollPosition in Lua.

Het object-georiënteerde model

Een ander probleem met Lua is dat het geen overervingsysteem heeft zoals Objective-C. Er zijn helemaal geen lessen in Lua. Om dit probleem te omzeilen, onthult Wax een functie die aan de bovenkant van elk Wax Lua-bestand staat: waxClass. In de standaard AppDelegate.lua ziet de regel er als volgt uit:

 waxClass "AppDelegate", protocols = "UIApplicationDelegate"

Om een ​​Objective-C klasse van Lua te maken, wordt de functie waxClass "KLASSE NAAM", "PARENT_CLASS" gebruikt. Alle volgende functies (in hetzelfde bestand) die u toevoegt aan dat Lua-bestand, worden automatisch toegevoegd aan uw nieuwe klasse als instantiemethoden.

Zoals de regel van AppDelegate.lua laat zien, kunt u ook definiëren welke protocollen uw "klasse" definieert.

Hoewel waxClass het probleem van het definiëren van klassen voor gebruik door Objective-C oplost, is er nog steeds het probleem dat, aangezien Lua geen klassen heeft, het geen dynamische "zelf" -variabele heeft zoals Objective-C. Om dit te omzeilen, maakt Wax automatisch het eerste argument voor elke methode het huidige exemplaar van de klasse. U kunt zien wanneer u kijkt naar "applicationDidFinishLaunching" in AppDelegate.lua, het eerste argument is "self", gebeurtenis hoewel de Objective-C-versie van deze methode slechts één argument heeft. Het zou echter zeer vervelend zijn als u de huidige instantie van de klasse als het eerste argument voor elke methode zou moeten doorgeven, dus er is wat syntactische suiker toegevoegd. In plaats van het maken van een "methode" aanroep in Lua met behulp van de "." operator, wordt de operator "dubbele punt" gebruikt:

 lokale weergave = UIView.initWithFrame (CGRect (0, 0, 100, 100)) - de volgende zijn exact dezelfde weergave: addSubview (someView) view.addSubview (view, someView)

Een ander belangrijk ding om op te merken is dat Wax niet de eigenschappen van Objective-C ondersteunt. Wax dwingt Lua en Objective-C om alleen met methoden te communiceren.

 -- Dit gaat niet werken. someView.frame - U wilt in plaats daarvan de methode getter / setter gebruiken someView: frame () someView: setFrame (someFrame)

Lua-only variabelen

U kunt lidvariabelen dynamisch maken voor elk Objectief-C-object met behulp van de punt. operator. In tegenstelling tot de dubbele punt: operator (gebruikt om methoden op een Objective-C klasse / instantie aan te roepen) de punt. operator maakt dynamisch lidvariabelen aan de Lua-zijde van het object (de objectief-C-zijde van het object heeft geen kennis van deze variabelen). De lidvariabelen zijn beschikbaar gedurende de levensduur van het object.

Uitvoeren naar de console

AppDelegate.lua laat ook zien hoe u foutopsporende tekst naar de console kunt schrijven. U gebruikt de functie "zet".

Geheugen management

Als je je eraan herinnert, heb ik beloofd dat je nooit Lua zou moeten toewijzen, behouden en vrijgeven. U hoeft de allocatie nooit te bellen voordat u een van deinitializers belt. Als je dat wel doet, zal je programma waarschijnlijk geheugenlek veroorzaken.

Geweldig! Wat is het volgende?

Nu je de basisprincipes van wax-specifieke Lua goed begrijpt, ben je klaar om een ​​iPhone-app te schrijven!

In deel 2 van deze tutorial zullen we een voorbeeld van een Twitter-app maken met een verversingsknop die slechts enkele regels Lua gebruikt.