Una extensión de clase guarda cierta similitud a una categoría, pero sólo puede ser añadido a una clase para la cual tiene el código fuente en tiempo de compilación (la clase se compila al mismo tiempo que la extensión de clase). Los métodos declarados por una extensión de clase se implementan en el bloque @implementation para la clase original, por lo que no puede, por ejemplo, declarar una extensión de clase en una clase de infraestructura, como una clase Cocoa o Cocoa Touch como NSString.
La sintaxis para declarar una extensión de clase es similar a la sintaxis de una categoría, y tiene el siguiente aspecto:
@interface ClassName()
@end
Debido a que ningún nombre se da entre paréntesis, las extensiones de clase a menudo se refieren a categorías como anónimos .
A diferencia de las categorías normales, una extensión de clase puede agregar sus propias propiedades y variables de instancia a una clase. Si se declara una propiedad en una extensión de clase, así:
@interface XYZAnimal() {
id _someCustomInstanceVariable;
}
...
@end
en mi humilde opinión, lo mejor es pensar en las extensiones de clase como interfaz privada a una clase. La interfaz principal (en su archivo .h) actúa como la interfaz pública que define el contrato de comportamiento de la clase con otras clases.
extensiones Uso de clase para ocultar información privada
extensiones de clase a menudo se utilizan para extender la interfaz pública con métodos privados adicionales o propiedades para su uso dentro de la implementación de la clase en sí. Es común, por ejemplo, definir una propiedad como readonly en la interfaz, pero como readwrite en una extensión de clase declarada arriba de la implementación, para que los métodos internos de la clase puedan cambiar el valor de la propiedad directamente.
Como ejemplo, la clase XYZPerson podría agregar una propiedad llamada uniqueIdentifier, diseñada para realizar un seguimiento de información como un número de seguridad social en los EE. UU.
Por lo general, requiere una gran cantidad de documentos para tener un identificador único asignado a un individuo en el mundo real, por lo que la interfaz de clase XYZPerson puede declarar esta propiedad como de solo lectura y proporcionar algún método que solicite un identificador asignado, como esto:
@interface XYZPerson : NSObject
...
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
para que la clase XYZPerson para poder cambiar la propiedad internamente, que tiene sentido para redeclare la propiedad en una extensión de clase que se define en la parte superior del archivo de implementación para la clase:
@property (readwrite) NSString *uniqueIdentifier;
Nota: El atributo readwrite es opcional, porque es el predeterminado. Es posible que desee utilizarlo al redeclar una propiedad, para mayor claridad.
categorías son código real. son cómo agregar funciones a una clase. las extensiones son (en términos muy generales) más solo azúcar sintáctica, para señalar ciertas ideas sobre privacidad, etc., a otros programadores. las extensiones no contienen código y no son código. – Fattie
Para extensiones como se usan en Swift, vea esta pregunta: http://stackoverflow.com/questions/24142829/how-to-create-swift-class-for-category – Suragch