L'idea alla base del framework Wax è semplice: tutto ciò che l'Objective-C può fare, Lua può farlo anche tu! Ci sono molte buone ragioni per considerare la creazione di applicazioni native per iPhone con un linguaggio di scripting semplice ed efficiente come Lua, e questa serie di tutorial si immergerà nei benefici offerti da Wax mentre dimostrerà i passaggi pratici necessari per integrare Lua con Xcode 4 e iOS SDK.
Wax for iPhone è un framework scritto in modo da collegare il linguaggio di scripting Lua e le API native Objective-C. Ciò significa che è possibile utilizzare qualsiasi classe e framework Objective-C all'interno di Lua.
In termini tecnici, Wax è una combinazione di classi Objective-C e codice C nativo. Il linguaggio Lua è incorporato con C, e quindi le classi Objective-C sono unite nel mix.
La cera è gratuito e open-source. A differenza di altre soluzioni basate su Lua per lo sviluppo mobile, Wax è un framework open source che richiede solo un po 'di tempo per lavorare e non per guadagnare denaro. Non ti piace il modo in cui funziona Wax o trovi un bug nell'implementazione? Il codice sorgente è disponibile gratuitamente e puoi sempre modificarlo in base alle tue esigenze.
Puoi sfruttare le API native. Ciò significa che i tutorial scritti per insegnare Objective-C possono essere facilmente adattati e scritti con Lua for Wax. Ciò significa anche che la tua app apparirà sempre nativa, ma hai ancora il vantaggio di risparmiare tempo nello scrivere il tuo codice in Lua, un linguaggio di scripting efficiente.
Arrivi a usa Xcode. Ciò significa che sia il simulatore che la distribuzione del dispositivo sono un gioco da ragazzi e non dovrebbero rompersi facilmente con una versione futura di iOS.
Arrivi a sfruttare tutte le librerie Objective-C esistenti. Se hai una classe Objective-C che hai scritto in precedenza, puoi usarla in Lua - senza adattamenti - basta lanciarla in Xcode. La stessa cosa vale per le biblioteche come Three20. Basta aggiungerli secondo le normali istruzioni e puoi accedervi con il tuo codice Lua.
Arrivi a Sfrutta i moduli Wax Lua. Wax ha alcuni moduli Lua integrati che rendono le richieste HTTP asincrone e la creazione / analisi JSON incredibilmente facile e veloce (perché i moduli sono scritti in C).
tu non devo gestire la memoria. Niente più allocazioni di memoria e simili. Wax gestisce tutto questo per te.
I tipi Lua vengono automaticamente convertiti in equivalenti Objective-C e viceversa. Ciò significa che quando chiami un metodo che richiede una NSString e un NSInteger, ma passi una stringa Lua e un intero Lua, Wax si prenderà cura di te per te. Questa conversione è anche abbastanza potente per gestire complesse funzioni Objective-C come i selettori.
Arrivi a sfruttare tutto quanto sopra. Non c'è bisogno di scegliere. Hai capito tutto!
Bene, prima devi usare Xcode e l'iPhone SDK. Se non li hai ancora, vai a prenderli!
Iniziamo con la creazione di un nuovo "Progetto basato su finestre" chiamato "WaxApplication". Non dimenticare di impostare il dispositivo su iPhone:
Passare alla cartella in cui è stato salvato questo progetto in Finder. Crea tre nuove cartelle: cera, script e classi. La tua cartella dovrebbe apparire così:
Innanzitutto, scarica un file zip del codice sorgente. Wax è ospitato su GitHub in modo da rendere molto facile il download del codice sorgente. Scarica la zip da qui.
Ora decomprimere il file appena scaricato. Passare alla cartella appena estratta. Sarà chiamato qualcosa come "probablycorey-wax-124ca46".
Il tuo schermo dovrebbe ora assomigliare a questo:
Ora esegui le seguenti azioni:
Il tuo schermo dovrebbe assomigliare a questo:
Ora seleziona le cartelle Classi, script e wax nel Finder e trascinali nel progetto Xcode. Rilasciarli subito sotto la barra che dice "Applicazione cera" e "1 target, iOS SDK X.X". Deseleziona la casella di controllo "Copia gli elementi nella cartella del gruppo di destinazione (se necessario)". Fare clic su Fine.
Ora fai clic sulla barra che dice "Applicazione cera" e "1 target, iOS SDK 4.3". Ora fai i seguenti passi:
Il tuo schermo dovrebbe ora assomigliare a questo:
Nel riquadro a sinistra, apri la cartella denominata "WaxApplication". Quindi, aprire la cartella "File di supporto". Quindi, apri main.m e sostituisci il contenuto del file con questo:
// Questo dove avviene la magia! // Wax non usa i pennini per caricare la vista principale, tutto viene eseguito all'interno del file // AppDelegate.lua #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]] dentro]; wax_start ("AppDelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil); int retVal = UIApplicationMain (argc, argv, nil, @ "AppDelegate"); [rilascio pool]; return retVal;
Non dimenticare di salvare il file!
Eliminare i file MainWindow.xib, WaxApplicationAppDelegate.h e WaxApplicationAppDelegate.m. Aprire "WaxApplication / Supporting Files / WaxPallication-Info.plist" e quindi eliminare la riga in cui la chiave è "Nome base file del pennino principale".
Stampa ?? (Comando + Invio) o premi? Esegui? nell'angolo in alto a sinistra per eseguire l'app nel simulatore. Se tutto ha funzionato, vedrai una semplice app che dice "Ciao Lua!".
Se non vedi questo messaggio, rivedi i passaggi precedenti e verifica se hai perso un passaggio.
Espandi la collezione Scripts e apri AppDelegate.lua. Ora vedi il codice Lua che alimenta questa app.
La prima cosa che noterai probabilmente è che non c'è alcuna evidenziazione della sintassi. Sfortunatamente, non ho trovato una soluzione stabile per l'evidenziazione della sintassi Lua in Xcode (ma se ne trovi una, per favore pubblica uno nei commenti!).
La seconda cosa che probabilmente noterete è che non ci sono parentesi quadre, tuttavia vengono utilizzate classi come UIScreen e UIWindow. Questo perché stai facendo una classe AppDelegate in Lua, e per quanto Apple e il codice Apple possono dirlo, stai usando Objective-C e facendo classi Objective-C!
Si può anche notare il nome del metodo dispari "colorWithRed_green_blue_alpha". Se hai familiarità con Objective-C, saprai che il nome dei metodi può avere due punti. Non puoi avere due punti nei nomi di funzioni in Lua. Per compensare questa differenza, in qualsiasi posto il nome di un metodo viene spezzato in Objective-C, in Lua ha un trattino basso. Per esempio:
Un altro problema con Lua è che non ha un sistema di ereditarietà come Objective-C. Non ci sono classi a Lua. Per ovviare a questo problema, Wax espone una funzione che si trova nella parte superiore di ogni file Wax Lua: waxClass. Nel predefinito AppDelegate.lua, la linea ha il seguente aspetto:
waxClass "AppDelegate", protocolli = "UIApplicationDelegate"
Per creare una classe Objective-C da Lua, viene utilizzata la funzione waxClass "CLASS NAME", "PARENT_CLASS". Tutte le funzioni successive (all'interno dello stesso file) che aggiungi a quel file Lua verranno automaticamente aggiunte alla tua nuova classe come metodi di istanza.
Come mostra la riga di AppDelegate.lua, puoi anche definire quali protocolli definisce la tua "classe".
Sebbene waxClass risolva il problema della definizione delle classi per l'uso in Objective-C, c'è ancora il problema che poiché Lua non ha classi, non ha una variabile "self" dinamica come Objective-C. Per aggirare questo problema, Wax crea automaticamente il primo argomento per ogni metodo dell'istanza corrente della classe. È possibile vedere quando si guarda "applicationDidFinishLaunching" in AppDelegate.lua, il primo argomento è "self", evento sebbene la versione Objective-C di questo metodo abbia solo 1 argomento. Tuttavia, sarebbe molto fastidioso se dovessi passare l'istanza corrente della classe come primo argomento per ogni metodo, quindi è stato aggiunto dello zucchero sintattico. Invece di fare una chiamata "metodo" a Lua usando "." operatore, viene utilizzato l'operatore "due punti":
local view = UIView.initWithFrame (CGRect (0, 0, 100, 100)) - i seguenti sono esattamente la stessa vista: addSubview (someView) view.addSubview (view, someView)
Un'altra cosa importante da notare è che Wax non supporta le proprietà ObjectObjective-C. Le forze di cera Lua e Objective-C comunicano solo con i metodi.
-- Questo NON FUNZIONERÀ. someView.frame - Volete usare i metodi getter / setter invece someView: frame () someView: setFrame (someFrame)
È possibile creare dinamicamente variabili membro per qualsiasi oggetto Objective-C utilizzando il punto. operatore. A differenza dei due punti: operatore (usato per chiamare metodi su una classe / istanza Objective-C) il punto. l'operatore crea dinamicamente variabili membro sul lato Lua dell'oggetto (il lato Objective-C dell'oggetto non ha conoscenza di queste variabili). Le variabili membro sono disponibili per tutta la durata dell'oggetto.
AppDelegate.lua mostra anche come scrivere testo di debug sulla console. Usa la funzione "mette".
Se ricordi, ti ho promesso che non avresti mai dovuto allocare, trattenere e rilasciare con Lua. Non è mai necessario chiamare l'allocazione prima di chiamare uno qualsiasi degli inizializzatori. In effetti, se lo fai, probabilmente il tuo programma perde memoria.
Ora che hai una solida conoscenza delle nozioni di base di Lua specifica per Wax, sei pronto per scrivere un'app per iPhone!
Nella parte 2 di questo tutorial, creeremo un'app di Twitter di esempio con un pulsante di aggiornamento utilizzando solo alcune righe di Lua.