În tutorialul de astăzi, veți afla despre categorii și cum să le folosiți pentru a extinde funcționalitatea clasei Cocoa-Touch. Aceasta este ultima noastră tranșă din seria Aflați obiectivul-C, astfel încât veți fi, de asemenea, furnizat o recapitulare rapidă a ceea ce am acoperit până acum și apoi vom analiza ce puteți face pentru a-ți aprofunda abilitățile ca un Obiect-C sau iPhone dezvoltator de aplicatii.
Deci, care sunt categoriile? Multe tutoriale și serii de obiecte-C vor trece cu vederea categoriile, ceea ce este o rușine, deoarece acestea sunt o caracteristică utilă a limbajului uimitor de utilă. Categoriile vă ajută să păstrați codul curat și mai puțin aglomerat eliminând nevoia de subclasare inutilă. Din ceea ce am învățat până acum, dacă am avea un obiect NSString că am vrut să adăugăm funcționalitate pentru a face ceva de genul a adăuga o metodă care ar înlocui toate caracterele "a" cu un "4" (inutil știu, dar de exemplu numai pentru scopuri), atunci am putea subclasa NSString și să adăugăm singuri metoda. De asemenea, am văzut acest tip de subclasare atunci când am făcut clasa mașinilor noastre și te-am întrebat la sfârșitul tutorialului de a crea o subclasă de mașină, astfel încât să poți adăuga funcționalitate la clasa de bază. Subclasarea este o abordare bună și nu vă spun în nici un caz să întrerupeți subclasarea, dar, în anumite situații, categoriile oferă o abordare mai bună pentru a adăuga unele funcționalități suplimentare unei clase.
Categoriile ne permit să adăugăm metode la o clasă existentă, astfel încât toate instanțele din acea clasă din aplicația dvs. să câștige funcționalitatea. De exemplu, să spunem că avem 100 de obiecte NSString în aplicația dvs., dar doriți să creați o subclasă personalizată, astfel încât fiecare NSString să aibă o metodă suplimentară (de exemplu, reverseString). Cu categorii putem adăuga pur și simplu metoda într-o categorie și toate instanțele vor putea să folosească noua metodă. Sintaxa este evident diferită de subclasarea și categoriile nu vă permit să utilizați variabile de instanță. Cu toate acestea, este posibil să suprascrieți o metodă deja în vigoare, dar acest lucru ar trebui făcut cu precauție și numai dacă acest lucru este într-adevăr necesar.
Categoriile urmează aceeași structură de sintaxă ca o clasă, deoarece au o implementare și o interfață. Interfața arată astfel:
@interface ClassNameHere (categoria) // declarație de metodă @end Implementarea arată astfel; @implementation ClassNameHere (categoria) // implementarea metodei @end
Ușor, nu? Deci, să aruncăm o privire la un exemplu. Vom face o metodă simplă care va inversa un șir. Deși această metodă este practic inutilă; nu este ceea ce face metoda este important. Ar trebui să știți deja cum va arăta interfața, dar aici este oricum:
@ interfață NSString (inversă) - (NSString *) reverseString; @Sfârșit
Acum, pentru a crea implementarea noastră:
@implementation NSString (invers) - (NSString *) reverseString @end
Apoi, va trebui să adăugăm un cod simplu pentru a răsturna șirul. Deoarece adăugăm metode la clasa NSString, trimitem șirul folosind sine. Acum, pentru a inversa șirul vom avea nevoie de un obiect șir nou temporar pentru a ține stringul inversat. Modul în care vom inversa șirul este să purtăm pur și simplu șirul invers în sens invers, de fiecare dată când găsim un nou caracter, îl vom adăuga la obiectul șir inversat. Codul pentru aceasta este:
int lungime = [auto lungime]; NSMutableString * reversedString; reversedString = [[NSMutableString alocă] initWithCapacity: length]; în timp ce (lungime> 0) [reversedString appendString: [NSString stringWithFormat: @ "% C", [caracter characterItIndex: - lungime]]; retur [reversedString autorelease];
Această metodă este destul de simplă, căutăm o dată pentru fiecare caracter din șir. Adăugăm caracterul curent folosind stringWithFormat și identificatorul caracterului (C). Când numim - lungime, nu numai că returăm lungimea întregului, ci și scăderea de la el, astfel încât bucla noastră se mișcă de-a lungul șirului.
Dacă totul a mers bine, atunci toate NSString-urile care se află deja în proiectul nostru ar trebui să adere la noua noastră categorie. Acum puteți vedea de ce categoriile sunt atât de utile!
Ok, acum toate obiectele NSString ar trebui să aibă metoda reverseString. Doar pentru a revedea, codul nostru ar trebui să arate astfel:
@ interfață NSString (inversă) - (NSString *) reverseString; @end @implementation NSString (invers) - (NSString *) reverseString int length = [self length]; NSMutableString * reversedString; reversedString = [[NSMutableString alocă] initWithCapacity: length]; în timp ce (lungime> 0) [reversedString appendString: [NSString stringWithFormat: @ "% C", [caracter characterItIndex: - lungime]]; retur [reversedString autorelease]; @Sfârșit
Fiecare bloc de cod (interfață și implementare) ar trebui să fie în propriile fișiere respective prin convenție. Cu toate acestea, numim categorii puțin diferit. Cele două fișiere pe care le-am creat sunt numite: NSString + reverse.h
(interfață) și NSString + reverse.m
(Implementare).
Aceasta este o convenție tipică de tipare după modelul denumirii clasei pe care o adăugăm o categorie, un semn plus și numele categoriei noastre. Înainte de a continua, amintiți-vă că trebuie încă să includeți fișierul cu antet în proiectul principal. Deci, acum codul nostru ar trebui să arate cam așa:
NSString * testString = @ "Doar un test"; [testString reverseString]; NSLog (@ "inversat: '% @'", testString);
Dacă totul merge conform planului, atunci Consola ar trebui să înregistreze o versiune inversă a "Just a test"!
Dacă totul nu merge conform planului, verificați dacă ați copiat corect codul pentru reverseString și asigurați-vă că includeți fișierul header (* .h) pentru categoria din fișierul de cod principal.
După cum puteți vedea, categoriile sunt într-adevăr utile (mai ales cu șiruri de caractere). Acestea au o gamă largă de utilizări în orice proiect, una comună pe care o folosesc este validarea. În acest fel îmi pot păstra toată validarea într-un singur loc și nu trebuie să folosesc subclase complicate.
Nu numai că acest lucru este sfârșitul tutorialului de azi, acesta este sfârșitul seriei cu privire la fundamentele Obiectivului-C. În ultimele câteva tutoriale am abordat următoarele subiecte:
Sper că v-ați bucurat de această serie și dacă ați citit doar unul sau două tutoriale până acum, vă încurajez să începeți în ziua 1 și să citiți un tutorial pe zi. Până la sfârșitul seriei, ar trebui să fii suficient de încrezător pentru a începe să îți scrieți codul în mai puțin de o săptămână!
Dacă aveți întrebări cu privire la seria sau exemplele afișate sau dacă doriți un tutorial suplimentar pe o altă zonă a programării Obiectiv-C, vă rugăm să lăsați un comentariu mai jos.
Dacă aveți întrebări despre Obiectiv-C în sine, un proiect pe care lucrați sau doar niște sfaturi tehnice, nu ezitați să renunțați la o mențiune sau un mesaj direct pe Twitter sau să vizitați site-ul meu și să găsiți calea spre Formular de contact!
Acum că am terminat, provocările sunt nesfârșite. Vă sugerez foarte mult să puneți stiloul pe hârtie și să decideți despre o primă aplicație care să se construiască de la început până la zero. Vino cu o idee și un design, apoi aplicați toate principiile pe care le-ați învățat din această serie și spuneți-ne ce vă propuneți!
Vă mulțumim pentru lectură!