Come sviluppare in PHP con Xcode e Objective-C

Come molti programmatori usano fare, anch’io mi costruisco le mie librerie di funzioni pronte per essere riutilizzate in più progetti e in più contesti. Lasciatemi passare il titolo di questo post, forse un po’ azzardato ma, tuttavia, come vedremo, non lontano dalla realtà.

In Objective-C è possibile scrivere e chiamare codice C/C++, compreso l’assembly se è per questo. Questa sua caratteristica lo rende un linguaggio davvero versatile e, per certi aspetti, fenomenale. Da un lato, infatti, è possibile utilizzare e apprezzare la sintassi prettamente Objective-C, dall’altro è possibile eseguire velocemente porting di codice scritto in ANSI C (magari per Digital Unix o Sun) e utilizzarlo comodamente nelle nostre applicazioni iPhone o iPad; per non parlare di tutto il Kernel BSD già disponibile su Mac OS X!

Una delle attività che qualsiasi sviluppatore – anche alle prime armi – dovrebbe fare, è quella di semplificarsi la scrittura del codice, soprattutto semplificare la chiamate a quelle funzioni che utilizza più spesso. Su Apple iPhone/iPad, ad esempio, una qualsiasi applicazione o presto o tardi dovrà fare uso dell’oggetto UIAlertView, strumento comodissimo per informare l’utente di un evento o, eventualmente, per chiedere la conferma o meno ad un’azione. Questo oggetto è utilizzato al pari dell’alert() di Javascript, per intenderci.

Ebbene, una sua chiamata, nella forma più semplice, viene risolta dal codice:

1
2
3
4
5
6
7
8
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Titolo"
    message:@"Corpo del messaggio"
    delegate:nil
    cancelButtonTitle:@"Ok"
    otherButtonTitles:nil];
   
    [alert show];
    [alert autorelease];

Ora, non sarebbe bello poter scrivere in Objective-C una cosa simile?:

1
alert(@"Titolo", @"Corpo del messaggio", @"Ok");

Ebbene, la cosa è fattibile e semplicissima da implementare. Tutto il codice non appartenente alla classe, come ad esempio accade per le dichiarative #define, va inserito prima di @interface, nel caso del file .h e prima di @implementation, nel caso dei file di implementazione .m.

Possiamo quindi crearci una nostra personale libreria (con codice addirittura misto quindi) con le nostre funzioni – commodity – aggiuntive. A titolo di esempio creiamo due file phpFunctions.h e phpFunctions.m.
Nel file header phpFunctions.h scriviamo:

1
2
3
// phpFunctions.h

void alert(NSString* title, NSString* message, NSString* dismissButtonTitle);

Nel file di implementazione phpFunctions.m scriviamo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// phpFunctions.m

#import "phpFunctions.h"

void alert(NSString* title, NSString* message, NSString* dismissButtonTitle) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle: title
    message: message
    delegate:nil
    cancelButtonTitle: dismissButtonTitle
    otherButtonTitles:nil];
   
    [alert show];
    [alert autorelease];
}

Fatto! Da questo momento in poi, se in un view controller includiamo phpFunctions.h, saremo in grado di scrivere più semplicemente:

1
2
3
4
5
6
7
8
9
10
11
#import "phpFunctions.h"

// ...

- (void)mioMessaggio:(int)valore {
    if(valore > 10) {
        alert(@"Informazioni", @"Valore maggiore di 10", @"Bravo");
    } else {
        alert(@"Informazioni", @"Valore minore di 10", @"Meno bravo");
    }
}

Questa procedura può essere applicata a tante funzioni e funzionalità. Come ulteriore esempio, proviamo a riscrivere la funzione explode() di PHP, che scompone una data stringa in base ad un determinato separatore, restituendo un array di stringhe. In Objective-C questa funzionalità è relaizzata da:

1
2
3
4
5
// Esempio di split / explode
NSString *stringaDaScomporre = @"Sono una stringa da scomporre";
NSArray *parti = [stringaDaScomporre componentsSeparatedByString:@" "];

NSLog(@"parti = %@", parti);

In questo caso procediamo esattamente come prima, ampliando la nostra libreria. Nel file phpFunctions.h aggiungete:

1
2
3
// phpFunctions.h

NSArray * explode(NSString *delimiter, NSString *string);

Nel file .m aggiungete:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// phpFunctions.m

#import "phpFunctions.h"

/*!
    @function   explode()
    @abstract   PHP style
    @discussion Scompone una strimnga in base ad un delimitatore
    @param      delimiter Stringa delimitatore
    @param      string Stringa da scomporre
    @result     array di stringhe
*/

NSArray * explode(NSString *delimiter, NSString *string) {
    return [string componentsSeparatedByString:delimiter];
}

Il guadagno di codice, in questo caso particolare, non è tantissimo, tuttavia, per chi come me sviluppa in PHP, Javascript, ActionScript e Objective-C, può tornare utile ricrearsi una certa uniformità, o famigliarità, di funzioni. Risulta sicuramente più menomico explode() – se provenite da PHP – che componentsSeparatedByString.

Abbiamo ora due comode funzioni da utilizzare nei nostri progetti. Da questo momento in poi, se dovete scomporre una stringa, potrete scrivere:

1
2
3
4
5
6
#import "phpFunctions.h"

NSString *stringaDaScomporre = @"Sono una stringa da scomporre";
NSArray *parti = explode(@" ", stringaDaScomporre);

NSLog(@"parti = %@", parti);

A voi non rimane altro che far crescere questa libreria, così da velocizzare la scrittura di magnifiche applicazioni per iPhone, iPad e Mac OS o, più in generale, per iOS.