Lär objektiv-C Dag 6

I dagens handledning lär du dig mer om kategorier och hur du använder dem för att utöka funktionen i Cocoa-Touch-klasserna. Det här är vår sista avbetalning i Learn Objective-C-serien, så du får också en snabb uppsats om vad vi hittills har täckt och sedan tittar på vad du kan göra för att öka dina färdigheter som mål-C eller iPhone Applikationsutvecklare.

kategorier

Så vad är kategorierna? En hel del objektiv-C-tutorials och serier kommer att förbise kategorier, vilket är synd eftersom de är så användbara språkfunktioner som är otroligt användbara. Kategorier hjälper till att hålla koden ren och mindre rörig genom att eliminera behovet av onödig underklassering. Från vad vi har lärt oss hittills, om vi hade ett NSString-objekt som vi ville lägga till funktionalitet för att göra något liknande, lägg till en metod som skulle ersätta alla "a" tecken med en "4" (meningslös jag vet, men till exempel ändamål), då kunde vi subclass NSString och lägga till metoden själv. Vi såg också denna typ av underklassning när vi gjorde vår bilklass, jag frågade dig i slutet av den här handledningen att göra en underklass av bil så att du kunde lägga till funktionalitet till basklassen. Subclassing är ett bra tillvägagångssätt, och jag säger inte på något sätt att du slutar subclassing, men i vissa situationer ger kategorier en bättre inställning för att lägga till extra funktionalitet till en klass.

Kategorier tillåter oss att lägga till metoder i en befintlig klass, så att alla instanser av den klassen i din ansökan får din funktionalitet. Till exempel, säg att vi har 100 NSString-objekt i din app, men du vill skapa en anpassad underklass så att varje NSString har en extra metod (reverseString till exempel). Med kategorier kan vi helt enkelt lägga till metoden i en kategori och alla instanser får använda den nya metoden. Syntaxen är uppenbarligen något annorlunda än underklassen och kategorierna tillåter dig inte att använda instansvariabler. Det är dock möjligt att skriva över en metod som redan finns på plats, men detta bör göras med försiktighet och endast om det är så är det verkligen nödvändigt.

Syntax

Kategorier följer samma syntaxlayout som en klass, som i de har en implementering och ett gränssnitt. Gränssnittet ser ut så här:

 @interface ClassNameHere (category) // metoddeklaration (er) @end Implementeringen ser ut så här; @implementation ClassNameHere (category) // metod implementering (er) @end 

Exempel

Lätt, eller hur? Så låt oss titta på ett exempel. Vi ska göra en enkel metod som kommer att vända en sträng. Medan denna metod är praktiskt taget värdelös; Det är inte vad metoden gör som är viktigt. Du borde redan veta hur gränssnittet kommer att se ut, men här är det ändå:

 @interface NSString (omvänd) - (NSString *) reverseString; @slutet 

Nu för att skapa vår implementering:

 @implementation NSString (omvänd) - (NSString *) reverseString  @end 

Därefter måste vi lägga till en enkel kod för att bläddra i strängen runt. Eftersom vi lägger till metoder i NSString-klassen hänvisar vi till strängen med hjälp av self. Nu för att vända strängen behöver vi ett nytt, tillfälligt strängobjekt för att hålla den omvända strängen. Det sätt som vi kommer att vända om strängen är att helt enkelt slinga igenom den befintliga strängen i omvända, varje gång vi hittar en ny karaktär lägger vi till det omvända strängobjektet. Koden för detta är:

 int längd = [självlängd]; NSMutableString * reversedString; reversedString = [[NSMutableString alloc] initWithCapacity: längd]; medan (längd> 0) [reversedString appendString: [NSString stringWithFormat: @ "% C", [self characterAtIndex: - length]]];  returnera [reversedString autorelease]; 

Denna metod är ganska enkel, vi går igenom en gång för varje tecken i strängen. Vi lägger till det aktuella tecknet med hjälp av stringWithFormat och tecken (C) -identifieraren. När vi kallar - längd returnerar vi inte bara heltalets heltal, vi subtraherar också det, vilket är hur vår slinga rör sig längs strängen.

Om allt har gått bra måste alla NSString redan vara i vårt projekt följa vår nya kategori. Nu kan du se varför kategorierna är så användbara!

Använda vårt exempel

Ok, nu ska alla våra NSString-objekt ha vår ReverseString-metod. Bara för att läsa om, vår kod ska se ut så här:

 @interface NSString (omvänd) - (NSString *) reverseString; @end @implementation NSString (omvänd) - (NSString *) reverseString int längd = [självlängd]; NSMutableString * reversedString; reversedString = [[NSMutableString alloc] initWithCapacity: längd]; medan (längd> 0) [reversedString appendString: [NSString stringWithFormat: @ "% C", [self characterAtIndex: - length]]];  returnera [reversedString autorelease];  @slutet 

Varje block av kod (gränssnitt och implementering) ska vara i sina egna respektive filer per konvention. Men vi heter kategorier lite annorlunda. De två filerna som vi har skapat heter: NSString + reverse.h (gränssnitt) och NSString + reverse.m (genomförande).

Det här är en typisk namngivningskonvention som följer namnet på klassen vi lägger till en kategori till, ett plustecken och namnet på vår kategori. Innan vi fortsätter, kom ihåg att vi fortfarande måste inkludera vår huvudfil i huvudprojektet. Så nu ska vår kod se ut så här:

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

Om allt gick enligt planen bör konsolen logga in en omvänd version av "Just a test"!

Om allt inte går enligt planen, kontrollera att du har kopierat koden för reverseString korrekt och se till att du inkluderar rubriken (* .h) för kategorin i din huvudkodfil.

Som du kan se är kategorier verkligen ganska användbara (särskilt med strängar). De har ett stort antal användningsområden i något projekt, en vanlig jag använder är validering. På så sätt kan jag behålla all min validering på ett ställe och behöver inte använda några komplicerade underklasser.

Wrapping Up Series

Det här är inte bara slutet på dagens tutorial, det här är slutet på serien på Objective-Cs grundval. Under de senaste tutorialsna har vi behandlat följande ämnen:

  • Grundläggande för programmering
  • Grunden för OOP
  • Klasser och underklasser
  • Minneshantering
  • Bra övning
  • Några Standard Naming Conventions

Jag hoppas att du har haft den här serien och om du bara har läst en eller två av handledningarna hittills uppmanar jag dig att börja på dag 1 och läsa en handledning per dag. I slutet av serien bör du vara säker nog att börja skriva din egen kod på knappt en vecka!

Om du har några frågor om serien eller exemplen som visas, eller om du vill ha en ytterligare handledning på ett annat område med Objective-C programmering, var god att lämna en kommentar nedan.

Om du har några frågor om Objective-C själv, ett projekt som du jobbar på eller bara några tekniska råd, tveka inte att släppa mig ett omnämnande eller direktmeddelande på Twitter eller besök min hemsida och hitta din väg till Kontaktformulär!

Utmaning

Nu när vi är färdiga är utmaningarna oändliga. Jag föreslår starkt att du lägger penna på papper och bestämmer om en första app ska byggas från början till början. Kom upp med en idé och en design, använd sedan alla principer du har lärt dig i serien och låt oss veta vad du kommer med!

Tack för att du läser!