web-dev-qa-db-fra.com

Extension de classe vs catégorie de classe

Les extensions de classe @interface Class () sont beaucoup plus puissantes et peuvent injecter des variables dans la classe. Les catégories @interface Class (Category) ne peuvent pas. 

Quelles sont les autres différences et quand faut-il utiliser une catégorie sur une extension de classe?

75
David

La principale différence réside dans le fait qu'avec une extension, le compilateur s'attend à ce que vous implémentiez les méthodes dans votre @implementation principal, alors qu'avec une catégorie, vous disposez d'un bloc @implementation séparé. Vous ne devriez donc utiliser qu’une extension en haut de votre fichier principal .m (le seul endroit où vous devriez vous soucier d’ivars, incidemment) - c’est-à-dire une extension .

87
jtbandes

Une extension de classe présente certaines similitudes avec une catégorie, mais elle ne peut être ajoutée qu'à une classe pour laquelle vous disposez du code source au moment de la compilation (la classe est compilée en même temps que l'extension de classe). Les méthodes déclarées par une extension de classe sont implémentées dans le bloc @implementation de la classe d'origine. Vous ne pouvez par exemple pas déclarer une extension de classe sur une classe d'infrastructure telle qu'une classe Cocoa ou Cocoa Touch telle que NSString.

La syntaxe permettant de déclarer une extension de classe est similaire à celle d'une catégorie et se présente comme suit:

@interface ClassName ()
@end

Comme aucun nom n’est donné entre parenthèses, les extensions de classe sont souvent appelées catégories anonymes.

Contrairement aux catégories classiques, une extension de classe peut ajouter ses propres propriétés et variables d'instance à une classe. Si vous déclarez une propriété dans une extension de classe, procédez comme suit:

@interface XYZAnimal () {
    id _someCustomInstanceVariable;
}
...
@end

À mon humble avis, il est préférable de considérer les extensions de classe comme une interface privée avec une classe. L'interface principale (dans votre fichier .h) agit en tant qu'interface publique qui définit le contrat de comportement de la classe avec d'autres classes.

Utiliser les extensions de classe pour masquer les informations privées 

Les extensions de classe sont souvent utilisées pour étendre l'interface publique avec des méthodes ou propriétés privées supplémentaires à utiliser dans l'implémentation de la classe elle-même. Par exemple, il est courant de définir une propriété comme étant en lecture seule dans l’interface, mais comme readwrite dans une extension de classe déclarée au-dessus de l’implémentation, afin que les méthodes internes de la classe puissent modifier directement la valeur de la propriété.

Par exemple, la classe XYZPerson peut ajouter une propriété appelée uniqueIdentifier, conçue pour conserver des informations telles qu'un numéro de sécurité sociale aux États-Unis.

Un identifiant unique est généralement attribué à un individu du monde réel, ce qui oblige l'interface de classe XYZPerson à déclarer cette propriété comme étant en lecture seule et à fournir une méthode permettant d'attribuer un identifiant, comme ceci:

@interface XYZPerson : NSObject
    ...
    @property (readonly) NSString *uniqueIdentifier;
    - (void)assignUniqueIdentifier;
@end

Pour que la classe XYZPerson puisse modifier la propriété en interne, il est logique de redéclarer la propriété dans une extension de classe définie en haut du fichier d'implémentation de la classe:

@property (readwrite) NSString *uniqueIdentifier;

Remarque: L’attribut readwrite est facultatif, car c’est la valeur par défaut. Vous aimerez peut-être l'utiliser lors de la nouvelle déclaration d'une propriété, par souci de clarté.

22
John Doe

Les catégories sont une fonctionnalité du langage Objective-C qui vous permet d'ajouter de nouvelles méthodes à une classe existante. Les extensions sont un cas particulier de catégories qui vous permettent de définir des méthodes à implémenter dans le bloc d'implémentation principal.

Les déclarations privées peuvent être des extensions de classe, qui sont principalement des propriétés, car nous n'avons pas besoin de déclarer une méthode avant de l'appeler.

5
Julie Yu

extension ios similaire à c #, classe ou interface abstraite Java
catégorie ios similaire à l'extension de classe c #

0
Add080bbA