Apprendre Objective-C Jour 6

Dans le didacticiel d'aujourd'hui, vous allez apprendre à utiliser les catégories et à les utiliser pour étendre les fonctionnalités des classes Cocoa-Touch. Il s’agit de notre dernier volet de la série Apprendre Objective-C. Vous aurez ainsi la possibilité de récapituler rapidement ce que nous avons décrit jusqu’à présent, puis de voir ce que vous pouvez faire pour améliorer vos compétences en tant qu’objectif Objective-C ou iPhone. Développeur d'applications.

Les catégories

Alors, quelles sont les catégories? Un grand nombre de tutoriels et de séries Objective-C négligeront les catégories, ce qui est dommage, car ils constituent une fonctionnalité linguistique extrêmement utile. Les catégories permettent de garder le code propre et moins encombré en éliminant le besoin de sous-classes inutiles. D'après ce que nous avons appris jusqu'à présent, si nous souhaitions ajouter un objet à NSString, il faudrait ajouter une méthode permettant de remplacer tous les caractères "a" par un "4" (inutile, je sais, mais par exemple alors nous pourrions sous-classer NSString et ajouter la méthode nous-mêmes. Nous avons également vu ce type de sous-classe lors de la création de notre classe car, je vous ai demandé à la fin de ce tutoriel de créer une sous-classe de voiture afin que vous puissiez ajouter des fonctionnalités à la classe de base. Le sous-classement est une bonne approche, et je ne vous dis absolument pas d'arrêter le sous-classement, mais dans certaines situations, les catégories offrent une meilleure approche pour ajouter des fonctionnalités supplémentaires à une classe..

Les catégories nous permettent d'ajouter des méthodes à une classe existante, de sorte que toutes les instances de cette classe de votre application bénéficient de vos fonctionnalités. Par exemple, supposons que votre application contienne 100 objets NSString, mais vous souhaitez créer une sous-classe personnalisée afin que chaque NSString dispose d'une méthode supplémentaire (reverseString, par exemple). Avec les catégories, nous pouvons simplement ajouter la méthode dans une catégorie et toutes les instances seront autorisées à utiliser la nouvelle méthode. La syntaxe est évidemment légèrement différente de celle du sous-classement et les catégories ne vous permettent pas d'utiliser des variables d'instance. Cependant, il est possible de remplacer une méthode déjà en place, mais cela doit être fait avec prudence et uniquement si cela est vraiment nécessaire..

Syntaxe

Les catégories ont la même syntaxe qu'une classe, car elles ont une implémentation et une interface. L'interface ressemble à ceci:

 @interface ClassNameHere (category) // déclaration (s) de la méthode @end L'implémentation ressemble à ceci; @implementation ClassNameHere (category) // implémentation (s) de méthode @end 

Exemple

Facile, non? Alors regardons un exemple. Nous allons faire une méthode simple qui inversera une chaîne. Alors que cette méthode est pratiquement inutile; ce n'est pas ce que fait la méthode qui importe. Vous devriez déjà savoir à quoi ressemblera l'interface, mais la voici quand même:

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

Maintenant pour créer notre implémentation:

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

Ensuite, nous devrons ajouter un code simple pour retourner la chaîne. Comme nous ajoutons des méthodes à la classe NSString, nous référençons la chaîne à l'aide de self. Maintenant, pour inverser la chaîne, nous avons besoin d’un nouvel objet chaîne temporaire pour contenir la chaîne inversée. Pour inverser la chaîne, il suffit de parcourir en boucle la chaîne existante, chaque fois que nous trouvons un nouveau caractère, nous l'ajoutons à l'objet chaîne inversée. Le code pour cela est:

 int longueur = [longueur de soi]; NSMutableString * reverseString; reverseString = [[NSMutableString alloc] initWithCapacity: longueur]; while (length> 0) [reverseString appendString: [NSString stringWithFormat: @ "% C", [self characterAtIndex: - length]]];  return [inverseString autorelease]; 

Cette méthode est assez simple, nous parcourons une fois pour chaque caractère de la chaîne. Nous ajoutons le caractère actuel à l'aide de stringWithFormat et de l'identificateur de caractère (C). Lorsque nous appelons --length, nous ne renvoyons pas seulement la longueur entière, mais nous en soustrayons également. C'est ainsi que notre boucle se déplace le long de la chaîne..

Si tout s'est bien passé, tous les réseaux NSString déjà dans notre projet doivent adhérer à notre nouvelle catégorie. Maintenant, vous pouvez voir pourquoi les catégories sont si utiles!

Utiliser notre exemple

Ok, maintenant tous nos objets NSString devraient avoir notre méthode reverseString. Pour récapituler, notre code devrait ressembler à ceci:

 @interface NSString (reverse) - (NSString *) reverseString; @end @implementation NSString (reverse) - (NSString *) reverseString int length = [longueur propre]; NSMutableString * reverseString; reverseString = [[NSMutableString alloc] initWithCapacity: longueur]; while (length> 0) [reverseString appendString: [NSString stringWithFormat: @ "% C", [self characterAtIndex: - length]]];  return [inverseString autorelease];  @fin 

Chaque bloc de code (interface et implémentation) doit être dans leurs propres fichiers respectifs par convention. Cependant, nous appelons les catégories un peu différemment. Les deux fichiers que nous avons créés sont nommés: NSString + reverse.h (interface) et NSString + reverse.m (la mise en oeuvre).

Il s'agit d'une convention de dénomination typique suivant le modèle du nom de la classe à laquelle nous ajoutons une catégorie, un signe plus et le nom de notre catégorie. Avant de continuer, rappelez-vous que nous avons toujours besoin d'inclure notre fichier d'en-tête dans le projet principal. Alors maintenant, notre code devrait ressembler à ceci:

 NSString * testString = @ "Juste un test"; [testString reverseString]; NSLog (@ "Inversé: '% @'", testString); 

Si tout s'est déroulé comme prévu, la console devrait enregistrer une version inversée de "Juste un test".!

Si tout ne se déroule pas comme prévu, vérifiez si vous avez correctement copié le code de reverseString et assurez-vous d'inclure le fichier d'en-tête (* .h) de la catégorie dans votre fichier de code principal..

Comme vous pouvez le constater, les catégories sont vraiment très utiles (surtout avec des chaînes). Ils ont un large éventail d’utilisations dans tous les projets, et j’utilise couramment la validation. De cette façon, je peux garder toute ma validation au même endroit et ne pas utiliser de sous-classes compliquées..

Envelopper la série

Non seulement c'est le tutoriel de fin d'aujourd'hui, mais aussi la fin de la série sur les bases de Objective-C. Au cours des derniers tutoriels, nous avons abordé les sujets suivants:

  • Principes fondamentaux de la programmation
  • Fondements de la POO
  • Classes et sous-classes
  • Gestion de la mémoire
  • Bonnes pratiques
  • Quelques conventions de dénomination standard

J'espère que cette série vous a plu et que si vous n'avez lu qu'un ou deux tutoriels jusqu'à présent, je vous encourage à commencer le premier jour et à lire un tutoriel par jour. À la fin de la série, vous devriez être suffisamment confiant pour commencer à écrire votre propre code en moins d’une semaine.!

Si vous avez des questions sur la série ou les exemples présentés, ou si vous souhaitez un tutoriel supplémentaire sur un autre domaine de la programmation Objective-C, n'hésitez pas à laisser un commentaire ci-dessous..

Si vous avez des questions sur Objective-C lui-même, sur un projet sur lequel vous travaillez ou sur quelques conseils techniques, n'hésitez pas à me laisser une mention ou un message direct sur Twitter ou visitez mon site Web et retrouvez votre chemin vers le site. formulaire de contact!

Défi

Maintenant que nous avons terminé, les défis sont infinis. Je vous suggère fortement de mettre un stylo sur du papier et de choisir une première application à construire du début à la fin. Proposez une idée et un design, puis appliquez tous les principes que vous avez appris de cette série et faites-nous savoir ce que vous proposez!

Merci d'avoir lu!