vanilla under queen pressure meaning marty cancion baby año objective-c ios cocoa-touch cocoa objective-c-category

objective-c - queen - under pressure y ice ice



Añadiendo la misma categoría a múltiples clases (6)

Tengo una categoría de Objective-C que me gustaría agregar a varias clases sin duplicar el código contenido en la categoría. Simplemente quiero agregar los mismos métodos a varias clases.

Tengo categorías existentes en NSManagedObject subclases de NSManagedObject ( Book , Chapter , Page ) y me gustaría agregar una funcionalidad común a todas estas subclases de una manera limpia y mantenible.

Una forma sería agregar la categoría a su superclase común ( NSManagedObject ), pero eso tiene la consecuencia de agregar los métodos de la categoría a todas NSManagedObject subclases de NSManagedObject cuando quiero agregar los métodos a tres subclases de NSManagedObject ( Book , Chapter , Page ).

Otra solución sería crear una subclase NSManagedObject y luego heredar Book , Chapter y Page de esa subclase NSManagedObject . Este es el enfoque más limpio y directo. El gran inconveniente de este enfoque es que cuando el modelo de datos cambia y Xcode regenera las subclases, las restablecerá para que vuelvan a heredar de NSManagedObject lugar de SubclassedManagedObject . Me gustaría evitar usar algo como mogenerator / Xmo''d si es posible.

¿Es posible agregar una sola categoría en varias clases sin duplicar el código?

Gracias.


¿Por qué no crea los métodos de nivel de clase de código compartido en una clase central, a los que simplemente llama mediante métodos de shell en cada una de sus categorías?

Si sus categorías almacenan referencias asociadas, puede pasarlas a los métodos de nivel de clase para actuar.


Es un poco erróneo decir que proporcionar una categoría en nsmanagedobject "tiene la consecuencia no deseada de agregar los métodos de la categoría a todas las subclases de NSManagedObject". El código de categoría solo está vinculado cuando lo incluye en un archivo en el que lo está utilizando: no está modificando nsmanagedobject.

Dicho esto, si el código necesita conocer su objeto, puede crear un protocolo que cumpla con esas clases y luego usar conformsToProtocol en su código para realizar las pruebas. Probablemente sea un mejor enfoque genérico que las pruebas para tipos de clase específicos.


Por el resto de tus cosas allí, por lo que sé, tendrías que regresar y hacer una subclase común para que tus tres clases obtengan lo que quieres. Pero lo que puedo señalar es que, en lugar de utilizar su propio método IsSupported, probablemente sería mejor simplemente usar el método respondsToSelector de NSObject para saber si su clase implementa cualquier método especial que quiera que usen esas tres clases, que debería ser mejor. que comparando contra todas esas clases. Definitivamente mejor si agrega clases adicionales ya que no tiene que mantener o expandir esa lista gigante de cheques isMemberOfClass


Suena como que quieres algo como un módulo de rubí. No conozco ninguna manera de hacer tal cosa en el objetivo-c. Podría hacer un protocolo y hacer que cada una de sus clases se ajuste a su protocolo, pero eso no resuelve el problema de compartir la implementación de los métodos.

Echa un vistazo a esta pregunta , podría proporcionar algunas ideas más.


Todavía no conozco una forma limpia de hacer esto en Objective-C, pero con Swift 2.0, esto se puede implementar utilizando las Extensiones de Protocolo agregando funciones y / o propiedades a un protocolo existente. El protocolo puede entonces ser adoptado por un número arbitrario de clases, estructuras y / o enumeraciones.

protocol Numbered { func number() -> Int } extension Numbered { func number() -> Int { return Int(arc4random()) % 10 } } class Book : Numbered { } class Chapter : Numbered { } class Page : Numbered { } let myBook = Book() let myChapter = Chapter() let myPage = Page() print("myBook.number() = /(myBook.number())") print("myChapter.number() = /(myChapter.number())") print("myPage.number() = /(myPage.number())")

implementa correctamente el number() en las tres clases ( Book , Chapter , Page ):

myBook.number() = 5 myChapter.number() = 2 myPage.number() = 8


tal vez sea demasiado tarde ... Pero tal vez haya una forma de hacerlo ... Pero, usted dijo ... necesita tener la misma superclase

Category.h

@protocol MyProtocol <NSObject> - (NSString*)foo; @end @interface NSArray (category) <MyProtocol> @end @interface NSString (category) <MyProtocol> @end

Categoría.m

@interface NSObject (category) <MyProtocol> @end @implementation NSObject (category) - (NSString*)foo { return @"bar"; } @end

Esto tampoco me gusta, pero funciona.