¿Diferencia entre categoría y extensión de clase?


85

¿Cuál es la diferencia entre una categoría y una extensión de clase? Creo que ambos se usan para agregar métodos personalizados en clases existentes. ¿Alguien puede arrojar luz sobre esto? Se agradecerá mucho la ejemplificación con código.



3
Akusete, no se puede encontrar la página.
Adil Hussain

claramente ilustrado aquí, code.tutsplus.com/tutorials/…
grassyburrito

Respuestas:


103

Una categoría es una forma de agregar métodos a clases existentes. Por lo general, residen en archivos llamados "Class + CategoryName.h", como "NSView + CustomAdditions.h" (y .m, por supuesto).

Una extensión de clase es una categoría, excepto por 2 diferencias principales:

  1. La categoría no tiene nombre. Se declara así:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @fin
  2. La implementación de la extensión debe estar en el bloque principal @implementation del archivo.

Es bastante común ver una extensión de clase en la parte superior de un archivo .m que declara más métodos en la clase, que luego se implementan a continuación en la sección principal de @implementation de la clase. Esta es una forma de declarar métodos "pseudo-privados" (pseudo-privados en el sentido de que no son realmente privados, simplemente no están expuestos externamente).


13
En Class-Extensiosn, puede sobrescribir propiedades de una propiedad (pública) de solo lectura para que sea de lectura y escritura interna. Y desde LLVM 1.5, puede hacer aún más: ahora puede declarar variables de instancia en una extensión de clase para que desaparezcan de la interfaz normal.
Max Seelemann

¿Por qué agregar una extensión de clase cuando podría implementar esos métodos y propiedades directamente en la clase? Me parece un poco redundante.
user1721803

1
@ user1721803 Como sugirió Dave, es posible que desee mantener algunas propiedades / métodos sin exponer. Aquí es cuando se utilizan las extensiones. Considere una vista, podría conectar todas sus IBOutlets e IBActions en extensión y exponer métodos que permitan inicializar / actualizar Outlets y las acciones podrían delegarse nuevamente.
GoodSp33d

@MaxSeelemann, ¿puede hacer una demostración de cómo hacer que "una propiedad (pública) de solo lectura sea internamente de lectura y escritura" mediante un breve script? Gracias.
Allenlinli

Esta respuesta indica la extensión en el archivo "Class + CategoryName.swift", ¿es correcto?
Rishi

47
  1. Categoría

=> En Objective C, cuando desee agregar más funcionalidad a una clase sin herencia, simplemente use la categoría para ello.

=> Viene con su propia .h y .m archivo

=> se Categoryusa para agregar un nuevo método, no propiedades.

  1. Extensión de clase
-> In Objective C, when you want to make behaviour of some property private you use class extension.

-> it comes with **.h** file only.

-> mainly for properties.

Nota: cuando agregamos un nuevo archivo y seleccionamos una opción del objetivo c, la categoría muestra categoría y "categoría en" no "subclase de", por lo que se muestra como

@interface className (categoryName)
@end

-Usted conseguir dos archivos .h y .m con el nombre de archivo como ( className + categoryName.h y className + categoryName.m )

y en caso de extensión obtendrá

@interface className()
@end

-Obtendrá solo un archivo con el nombre className_extensionName.h

  • En categoría no eres dueño de la clase, pero en extensión sí lo eres.

5
@Prasanna: la extensión de clase viene solo con el archivo .m y no en .h
Saggy

1
la extensión de clase viene con un archivo .h solamente y no un .m
Nishu_Priya

32
  1. La categoría es una forma de agregar métodos a una clase, ya sea que el código fuente esté disponible o no, lo que significa que puede agregar una categoría a las clases básicas como NSString y también a sus propias clases personalizadas.

    La extensión solo se puede agregar a las clases cuyo código fuente está disponible porque el compilador compila el código fuente y la extensión al mismo tiempo.

  2. Podemos agregar variables de instancia y propiedades adicionales en la extensión de la clase pero no en la categoría.

  3. Cualquier variable y método dentro de la extensión ni siquiera es accesible para las clases heredadas.

  4. La categoría y la extensión están diseñadas básicamente para manejar una base de código grande, pero la categoría es una forma de extender la API de clase en varios archivos de origen, mientras que la extensión es una forma de agregar métodos requeridos fuera del archivo de interfaz principal.

  5. Use la categoría cuando tenga que dividir el mismo código de clase en diferentes archivos fuente de acuerdo con diferentes funcionalidades, y la extensión cuando solo necesite agregar algunos métodos requeridos a la clase existente fuera del archivo de interfaz principal. Además, cuando necesite modificar una variable de instancia declarada públicamente en una clase, por ejemplo, readonly para readwrite, puede volver a declararla en extensión.


3
Leí 5 preguntas similares con muchas respuestas, y esta es la mejor. ¡Gracias!
Honey

1
También puede agregar propiedades en la categoría. Ver la respuesta de @Pebby.
atulkhatri

7

Extensión : Hacer que los métodos sean privados y agregar propiedades de nuestra propia clase personalizada, no de la clase Apple.

Categoría : para agregar más métodos en la clase existente, no en la propiedad, se puede usar tanto para la clase personalizada como para la clase Apple NSString.


Simple y elegante. Sigue así
Abdul Yasin

3

También podemos tener propiedades usando establecer propiedad asociada en la clase de categoría.

@interface SomeClass (Private)

@property (nonatomic, assign) id newProperty;

@end

NSString * const kNewPropertyKey = @"kNewPropertyKey";

@implementation SomeClass (Private)

@dynamic newProperty;

- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}

- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}

@end

Consulte: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/


2
@interface SomeClass ()


- (void) anAdditionalMethod;


@end

Creo que no es la forma de declarar Categoría. La categoría debe tener un nombre

@interface SomeClass (XYZ)


- (void) anAdditionalMethod;


@end

por ejemplo

@interface NSMutableArray (NSMutableArrayCreation)

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

@end

Declarado para NSMutableArray por Apple


Así es como se declara una extensión, no una categoría -> @interface SomeClass ()
ChavirA

0

extensión ios similar a c #, clase abstracta de java o
categoría ios de interfaz similar a c #, extensión de clase java


4
su respuesta es como "el gato es similar al tigre, respondiendo a un ciego". Lol
Muruganandham K

1
en realidad no lo es. Es la explicación más directa y rápida si conoce c # o java.
Add080bbA

No muy descriptivo en absoluto, y apenas respondió la pregunta.
KVISH

0

Categorías

Las categorías se utilizan cuando se crea un archivo que contiene una gran cantidad de métodos, por lo que le brindan la posibilidad de dividir una sola clase en diferentes módulos. Además, si se realizan cambios en las categorías, el compilador no pierde el tiempo para compilar todo el proyecto. Las categorías no pueden agregar nuevas variables o propiedades y buscar su clase principal. Puede anular un método en una categoría, pero no es una buena idea porque el método no se puede anular más. Además, el flujo se puede realizar porque todas las categorías tienen el mismo nivel jerárquico y, por lo tanto, pueden existir dos categorías que pertenecen a la misma clase principal en tiempo de ejecución. También se pueden crear métodos protegidos usando categorías

Extensiones

Las extensiones le permiten anular la propiedad o agregar una nueva propiedad a la clase principal existente. Sintéticamente igual a las categorías que no tienen nombre y se representan como @interface class () No hay archivo .m presente y el método declarado en extensión debe implementarse en @implementación del archivo principal

Más ayuda en este enlace


0

Aquí está mi entendimiento:

Las extensiones se utilizan generalmente para agregar funciones adicionales a nuestra propia " clase personalizada ". Podemos agregar métodos privados o propiedades ampliando la interfaz de la clase que se puede utilizar dentro de la implementación de la clase.

Las extensiones deben escribirse dentro del mismo archivo que la clase. Por lo tanto, no puede escribir extensiones para tipos predefinidos como String, Float, etc.

Por otro lado, las categorías se pueden usar para agregar métodos adicionales a clases preexistentes. Por ejemplo, podemos crear nuestros propios métodos ampliando la clase String. Tenga en cuenta que no podemos crear propiedades adicionales en las categorías. También la principal ventaja de las categorías es que podemos escribir las categorías en cualquier otro archivo, fuera del archivo donde sale su clase.

Además, al crear categorías, se supone que debe darle un nombre dentro de los corchetes. Pero para la extensión no se requiere ningún nombre. De ahí que algunas veces también se denominen categorías anónimas.


Estás un poco desviado.
Abdul Yasin

@iPhoneDeveloper Podemos escribir la extensión para tipos predefinidos. Consulte este enlace: stackoverflow.com/a/33942484/2060508
yo2bh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.