In questa lezione cominceremo a capire che cosa sono gli oggetti e come definirli con il linguaggio Objective-C 2.0.
Quello che comunque consiglio di fare e` di leggere il documento della Apple Objective-C 2.0 .
OGGETTI
Ci chiediamo:<<Come la definizione di un oggetto puo` aiutarmi a realizzare la mia prima applicazione “intelligente” per iPhone?>>. Gli oggetti sono la base di qualsiasi programma scritto in Objective-C (Quindi per Mac ed iPhone).
E quindi non ci rimane che chiederci: <<Che cos’e` un oggetto?>>
Pensate ad una macchina. La possiamo definire tramite le sue caratteristiche:
Modello, Casa, Cilindrata, Colore.
Il nostro oggetto Car ha quindi queste property (proprieta`). Per le persone a cui non piacciono i vocaboli in inglese dico subito che sara` necessario imparare un po` di termini tecnici in inglese, ma non temete, questo sara` naturale dopo un po`.
Ma il nostro oggetto macchina non e` fatto solo di proprieta`, bensi` anche di methods (metodi):
accendi_la_macchina
spegni_la_macchina
Essendo un oggetto d’esempio per ora consideriamo solo questi metodi. I metodi, molte volte, utilizzano le proprieta` (le variabili) dell’ oggetto.
CREAZIONE DI UN OGGETTO
Vediamo ora di passare un po` alla pratica. Prendiamo il nostro XCode e creiamo un progetto iPhone “Automobili”.
Una volta creato il progetto dovremo creare la nostra classe Car, la classe identifica il nostro oggetto Car.
Aprite il gruppo Classes, nel quale sono elencate le classi.
Premete il tasto destro Add-> New File
Il tipo di file che dovete selezionare e` NSObject subclass sotto Cocoa Touch Classes
Chiamate questo file Car e lasciate l’ estensione “.m” .
Lasciate selezionata l’ opzione “Also create Car.h” . Con questa opzione selezionata XCode creera` l’ interfaccia dell’ oggetto.
Ecco il nostro oggetto Car nella lista delle classi.
CLASSI IN OBJ-C
Guardiamo che cosa c’e` scritto nel file Car.h (h sta per Header) che da ora in poi chiamero` interfaccia. La funzione di questo file e` quella di definire la struttura del nostro oggetto, lo scheletro. Nel file Car.m invece scriveremo l‘ implementazione, cioe` gli algoritmi.
INTERFACCIA
Ecco la nostra interfaccia
Con il comando #import si importa, in questo caso, la libreria Foundation. In Foundation ci sono molti oggetti utili che andremo ad utilizzare.
Con “@interface Car” cominciamo a definire la nostra interfaccia Car.
Dopo i “:” (due punti) possiamo specificare la nostra super class, la nostra classe padre. Una delle particolarita` degli oggetti e` quella di poter ereditare funzionalita` da altri oggetti. Il motivo per cui prima abbiamo selezionato NSObject subclass e` perche` il nostro oggetto e` una sottoclasse dell’ oggetto NSObject. NSObject e` un oggetto che fa parte della libreria Foundation. NSObject e` l’ oggetto generico secondo NextStep. Ora che sapete che la classe Car eredita le funzionalita` dell’ oggetto generico NSObject vi consiglio di andare a vedere nella documentazione: NSObject
Troverete tutta la lista dei metodi e la loro descrizione. I metodi ci permettono di agire su e con l’ oggetto.
DEFINIRE VARIABILI/OGGETTI E METODI DELLA CLASSE
L’ interfaccia di Car deve anche far capire agli altri programmatori che cosa fa il nostro oggetto. E` quindi bene dare dei nomi alle “cose” che abbiano senso.
Tra le due parentesi graffe definiremo le variabili e gli oggetti che utilizza la nostra classe.
Tra la parentesi graffa chiusa e l’ “@end” definiremo i metodi della classe Car.
Per avere un’ infarinatura un po` piu` teorica vi consiglio di leggervi il pdf di Objective-C della Apple (che e` un MUST se volete capire realmente che cosa state facendo). Ora come ora sto cercando di tenere un’ approccio un po` “pratico” che dovrebbe invogliarvi a leggere il pdf da me consigliato.
VARIABILI
Ci sarebbe da scrivere un’ articolo intero sulle variabili, sulle differenze tra variabili ed oggetti, sul fatto che si utilizzano variabili per utilizzare gli oggetti etc..
Quindi quello che faro` sara` quello di redirigervi ad un sito dove vengono scritte in dettaglio le variabili in C.
OGGETTI E PUNTATORI
Alcuni degli oggetti piu` utili che utilizzeremo sono:
NSString : oggetto stringa (guardate la documentazione mi raccomando!)
NSNumber : oggetto numero
NSArray : array (vettore) di oggetti NSObject, il nostro oggetto Car eredita NSObject quindi possiamo metterlo all’ interno del vettore NSArray
…..
Quando vogliamo utilizzare un oggetto dobbiamo prima di tutto dichiarare il puntatore che ci permette di allocare lo spazio di memoria necessario per quell’ oggetto:
NSString *laMiaStringa;
In questo modo ho dichiarato il puntatore che mi permettera` di accedere alla zona di memoria dove ci sara` la stringa, ma per ora dentro la variabile “laMiaStringa” non c’e` proprio nulla.
Vediamo quindi un esempio pratico con il nostro oggetto Car
Il nostro oggetto ora ha uno stato, un nome ed un colore. Ci servono i metodi per accedere e manipolare queste informazioni.
Il primo metodo “-(BOOL)isStarted;” ci dice se la nostra macchina e` accesa o no. Il meno “-” prima di “(BOOL)” ci dice che il nostro metodo e` un metodo non statico, vedremo in futuro che cosa significa. Con (BOOL) vogliamo dire che il nostro metodo restituisce un risultato tramite variabile BOOL, booleana o YES(1) o NO(0).
Il metodo “-(NSString*)name” ci restituira` il nome della macchina, mentre -(NSString*)color : il colore.
Come avrete capito i commenti (quelli in verde) sono molto importanti per annotare delle cose all’ interno del codice, anche per semplificare la vita agli altri programmatori. Per fare commenti bastera` aggiungere “//” prima del nostro commento.
Ora scrivo nell’ interfaccia i metodi che mi permettono di accendere e spegnere la macchina:
Ovviamente con la nostra interfaccia ora abbiamo solamente detto che il nostro oggetto IMPLEMENTA questi metodi, ma ora dobbiamo implementarli realmente!
Ora definiamo un metodo importantissimo “-init”
E` il metodo che ci permette di inizializzare il nostro oggetto con dei valori di default.
-initWithName:(NSString*)nomeMacchina color:(NSString*)coloreMacchina;
Questo e` il modo di definire in objective-C un metodo con due argomenti. Questa definizione conincide con la funzione
initWithName_color(NSString* nomeMacchina, NSString *coloreMacchina);
Chi non ha basi di programmazione legga il pdf da me consigliato e per ora non consideri troppo tutte le varie casistiche. Dopo un po` di pratica certe cose non chiare cominceranno ad avere senso.
IMPLEMENTAZIONE
Andiamo in Car.m, in questo file implementeremo i nostri, semplici, metodi.
Come prima cosa copiatevi tutta la lista dei metodi definiti nell’ interfaccia
Implementiamo come prima cosa il costruttore. Il costruttore ci permette di inizializzare il nostro oggetto impostando due valori, il nome ed il colore della macchina. Facciamo anche in modo che la macchina sia spenta una volta che l’ oggetto e` inizializzato.
le variabili name, color e status sono quelle dell’ oggetto Car. I valori che vengono impostati sono nomeMacchina, coloreMacchina e NO.
Essendo status=NO all’ inizio la nostra macchina sara` spenta.
Alla fine c’e` un “return self;” per ora scrivetelo senza farvi troppe domande.
-(BOOL)isStarted;
Questo metodo ci dice se la macchina e` accesa o no. La variabile nella quale e` memorizzato lo stato della macchina e` status
In questo modo restituiamo il valore contenuto all’ interno della variabile status rispondendo YES se la macchina e` accesa, NO nel caso sia spenta.
In questo modo restituiamo i valori name e color.
Per accendere e spegnere la nostra macchina andiamo a modificare unicamente il valore di status.
PROVIAMO A COMPILARE
Facciamo build per vedere se il codice che abbiamo scritto “compila” (non ha errori di struttura).
In basso a destra vedremo la scritta “Succeeded”, significa che la compilazione e` andata a buon fine. Ora abbiamo scritto il nostro oggetto e possiamo utilizzarlo.
UTILIZZIAMO IL NOSTRO OGGETTO
Per utilizzare subito il nostro oggetto senza per ora considerare l’ aspetto grafico andiamo all’ interno dell’ implementazione della classe AutomobiliAppDelegate (File AutomobiliAppDelegate.m) e andiamo all’ interno del metodo
– (void)applicationDidFinishLaunching:(UIApplication *)application;
Tutto quello che scriveremo all’ interno di questo metodo verra` eseguito all’ inizio dell’ esecuzione della nostra applicazione.
Per stampare a Console delle scritte possiamo utilizzare la funzione NSLog.
Vi spiego prima di tutto come funziona la funzione NSLog.
“ciao come va” -> Stringa char*
@”ciao come va” -> oggetto NSString
NSLog vuole come primo argomento un oggetto NSString
NSLog(@”Hello World”); -> produrra` un output “Hello World”
Se vogliamo stampare delle variabili a schermo dobbiamo specificare all’ interno della stringa il tipo di variabile e poi dobbiamo specificare la nostra variabile in questo modo:
BOOL status = YES;
NSLog(@”valore della variabile status = %d”,status);
1 = YES, 0 = NO.
Fate questa prova:
Poi fate “Build and Go” per avviare l’ applicazione
A questo punto sull’ iphone simulator non comparira` nulla, ma NSLog stampa i risultati sulla console. Per visualizzare la console fate Run -> Console
A questo punto vi comparira` la console
Come vedete il valore che viene stampato a schermo e` “1”.
NSLog
Vi scrivo un po` di esempi pratici
Output:
Il %@ serve per inserire una stringa. Vedete che al posto del primo %@ viene inserita la prima stringa “NSString *stringa1” ed al secondo %@ la seconda stringa.
Il simbolo “\n” si chiama newline e permette di andare a capo.
Ora provo a sostutuire stringa1 con stringa2
Output:
Ora invece inserisco anche dei numeri
Output:
UTILIZZO DEGLI OGGETTI E DEI METODI
Ora che sapete utilizzare, spero, NSLog possiamo vedere come utilizzare il nostro oggetto Car.
Un oggetto prima di esser utilizzato va inizializzato. Prima di esser inizializzato va allocato. La procedura di alloc serve per richiedere la memoria necessaria all’ oggetto.
Per utilizzare un metodo di un oggetto bisogna fare in questo modo
[oggetto metodo];
Esempio:
Output:
Come vedete l’ utilizzo del metodo “uppercaseString” dell’ oggetto NSString ha prodotto una stringa tutta in maiuscolo. Vi STRAconsiglio di andare a leggere la documentazione dell’ oggetto NSString, troverete anche il metodo “uppercaseString”
Come vedete il metodo uppercaseString ritorna la stringa in maiuscolo.
Proviamo ora ad utilizzare il nostro oggetto Car:
Prima di tutto dobbiamo importare la nostra interfaccia in questo modo
Abbiamo aggiunto la stringa
#import “Car.h”
alla lista degli import. In questo modo il compilatore sa che quando utilizziamo la scritta Car, stiamo parlando del nostro oggetto Car.
Sappiamo che come prima cosa il nostro oggetto va allocato e poi inizializzato.
Car *ferrari = [[Car alloc] initWithName:@”Ferrari” color:@”Rosso”];
[Car alloc] alloca la memoria e quindi [Car alloc] e` un oggetto Car allocato ma non inizializzato
iniWithName:(NSString*) color:(NSString*) inizializza l’ oggetto.
Ora il nostro oggetto Car *ferrari e` una macchina Ferrari di colore rosso spenta.
Output:
Accendiamo la macchina
Output:
Come vediamo dall’ output dopo aver chiamato il metodo “accendi” dell’ oggetto Car lo stato della macchina e` cambiato da 0 (NO) a 1 (YES).
Come avrete capito, ho cercato di spiegarvi velocemente e tramite esempi l’ inizio della programmazione ad oggetti con Objective-C. Vi consiglio CALDAMENTE di leggere il pdf della apple.
Nella prossima lezione introdurro` i loop: while, for
I controlli : if , else if, else, switch
Intanto studiate un po` quello che ho scritto ed il PDF!! Fate un po` di prove e consultate la documentazione!
Ho messo anche questa volta online il codice del progetto: Automobili.zip