Scopri Objective-C 6 ° giorno

Nel tutorial di oggi, imparerai a conoscere le Categorie e come utilizzarle per estendere la funzionalità delle classi Cocoa-Touch. Questa è la nostra ultima puntata nella serie Learn Objective-C, quindi ti verrà fornito anche un breve riassunto su ciò che abbiamo visto finora e poi guarderai cosa puoi fare per migliorare le tue abilità come Objective-C o iPhone sviluppatore di applicazioni.

categorie

Quindi, quali sono le categorie? Un sacco di tutorial e serie Objective-C trascureranno le categorie, il che è un peccato perché sono una caratteristica del linguaggio così utile che è incredibilmente utile. Le categorie aiutano a mantenere il codice pulito e meno ingombrante eliminando la necessità di sottoclassi non necessarie. Da quanto abbiamo appreso finora, se avessimo un oggetto NSString che volevamo aggiungere funzionalità per fare qualcosa come aggiungere un metodo che sostituisse tutti i caratteri 'a' con un '4' (inutile lo so, ma per esempio solo a scopo), quindi potremmo sottoclasse NSString e aggiungeremo il metodo da soli. Abbiamo anche visto questo tipo di sottoclasse quando abbiamo fatto la nostra lezione in auto, ti ho chiesto alla fine di quel tutorial per creare una sottoclasse di auto in modo da poter aggiungere funzionalità alla classe base. La sottoclasse è un buon approccio e non sto dicendo in alcun modo di interrompere la sottoclasse, ma, in certe situazioni, le categorie forniscono un approccio migliore per aggiungere alcune funzionalità extra a una classe.

Le categorie ci consentono di aggiungere metodi a una classe esistente, in modo che tutte le istanze di quella classe nell'applicazione ottengano le tue funzionalità. Ad esempio, supponiamo di avere 100 oggetti NSString nella tua app, ma ti piacerebbe creare una sottoclasse personalizzata in modo che ogni NSString abbia un metodo extra (reverseString per esempio). Con le categorie possiamo semplicemente aggiungere il metodo in una categoria e tutte le istanze saranno autorizzate a utilizzare il nuovo metodo. La sintassi è ovviamente leggermente diversa dalla sottoclassi e le categorie non consentono di utilizzare variabili di istanza. Tuttavia, è possibile sovrascrivere un metodo già in atto, ma questo dovrebbe essere fatto con cautela e solo se ciò è veramente necessario.

Sintassi

Le categorie seguono lo stesso layout di sintassi di una classe, poiché hanno un'implementazione e un'interfaccia. L'interfaccia ha questo aspetto:

 @interface ClassNameHere (category) // method declaration (s) @end L'implementazione è simile a questa; @implementation ClassNameHere (category) // implementazione (i) del metodo @end 

Esempio

Facile, giusto? Diamo un'occhiata a un esempio. Faremo un semplice metodo per invertire una stringa. Mentre questo metodo è praticamente inutile; non è ciò che il metodo sta facendo è importante. Dovresti già sapere come sarà l'interfaccia, ma qui è comunque:

 @interface NSString (reverse) - (NSString *) reverseString; @fine 

Ora per creare la nostra implementazione:

 @implementation NSString (reverse) - (NSString *) reverseString  @end 

Successivamente, dovremo aggiungere un semplice codice per capovolgere la stringa. Dato che stiamo aggiungendo metodi alla classe NSString, facciamo riferimento alla stringa usando self. Ora per invertire la stringa avremo bisogno di un nuovo oggetto stringa temporaneo per contenere la stringa invertita. Il modo in cui invertiremo la stringa consiste semplicemente nel fare il ciclo della stringa esistente al contrario, ogni volta che troviamo un nuovo carattere lo aggiungeremo all'oggetto stringa invertita. Il codice per questo è:

 int length = [lunghezza propria]; NSMutableString * reverseedString; reverseedString = [[NSMutableString alloc] initWithCapacity: length]; while (length> 0) [reverseendString appendString: [NSString stringWithFormat: @ "% C", [self characterAtIndex: - length]]];  return [reversedString autorelease]; 

Questo metodo è abbastanza semplice, stiamo eseguendo il ciclo una volta per ogni carattere nella stringa. Aggiungiamo il carattere corrente usando stringWithFormat e l'identificatore di carattere (C). Quando chiamiamo --length non solo restituiamo il numero intero della lunghezza, ma sottraiamo anche da esso, che è come il nostro loop si muove lungo la stringa.

Se tutto è andato bene, allora tutte le NSString già nel nostro progetto dovrebbero aderire alla nostra nuova categoria. Ora puoi capire perché le categorie sono così utili!

Usando il nostro esempio

Ok, ora tutti i nostri oggetti NSString dovrebbero avere il nostro metodo reverseString. Solo per ricapitolare, il nostro codice dovrebbe assomigliare a questo:

 @interface NSString (reverse) - (NSString *) reverseString; @end @implementation NSString (reverse) - (NSString *) reverseString int length = [lunghezza auto]; NSMutableString * reverseedString; reverseedString = [[NSMutableString alloc] initWithCapacity: length]; while (length> 0) [reverseendString appendString: [NSString stringWithFormat: @ "% C", [self characterAtIndex: - length]]];  return [reversedString autorelease];  @fine 

Ogni blocco di codice (interfaccia e implementazione) dovrebbe essere nei rispettivi file per convenzione. Tuttavia, chiamiamo le categorie un po 'diversamente. I due file che abbiamo creato sono chiamati: NSString + reverse.h (interfaccia) e NSString + reverse.m (implementazione).

Questa è una tipica convenzione di denominazione che segue lo schema del nome della classe a cui stiamo aggiungendo una categoria, un segno più e il nome della nostra categoria. Prima di continuare, ricorda che dobbiamo ancora includere il nostro file di intestazione nel progetto principale. Quindi ora il nostro codice dovrebbe assomigliare a questo:

 NSString * testString = @ "Solo un test"; [testString reverseString]; NSLog (@ "Reversed: '% @'", testString); 

Se tutto è andato secondo i piani, la Console dovrebbe registrare una versione invertita di "Solo un test"!

Se tutto non va secondo i piani, controlla di aver copiato correttamente il codice per reverseString e assicurati di includere il file di intestazione (* .h) per la categoria nel tuo file di codice principale.

Come puoi vedere, le categorie sono davvero molto utili (specialmente con le stringhe). Hanno una vasta gamma di usi in qualsiasi progetto, uno comune che uso è la convalida. In questo modo posso mantenere tutta la mia convalida in un posto e non devo usare alcuna sottoclasse complicata.

Avvolgere la serie

Non solo è la fine del tutorial di oggi, questa è la fine della serie sui fondamenti di Objective-C. Negli ultimi tutorial abbiamo trattato i seguenti argomenti:

  • Fondamenti di programmazione
  • Fondamenti di OOP
  • Classi e sottoclassi
  • Gestione della memoria
  • Buona pratica
  • Alcune convenzioni di denominazione standard

Spero che questa serie ti sia piaciuta, e se hai letto solo uno o due tutorial finora, ti incoraggio a iniziare dal primo giorno e a leggere un tutorial al giorno. Entro la fine della serie dovresti essere abbastanza sicuro da iniziare a scrivere il tuo codice in meno di una settimana!

Se avete domande sulla serie o sugli esempi mostrati, o se volete un tutorial aggiuntivo su un'altra area della programmazione Objective-C, sentitevi liberi di lasciare un commento qui sotto.

Se hai domande su Objective-C, su un progetto a cui stai lavorando o solo su qualche consiglio tecnico, non esitare a farmi una menzione o un messaggio diretto su Twitter o visitare il mio sito web e trovare la strada per il Modulo di Contatto!

Sfida

Ora che abbiamo finito, le sfide sono infinite. Consiglio vivamente di mettere nero su bianco e decidere una prima app da costruire dall'inizio alla fine. Vieni con un'idea e un design, quindi applica tutti i principi che hai appreso da questa serie e facci sapere cosa ti viene in mente!

Grazie per aver letto!