Nueva versión de Mogenerator (1.28) ¡con muchas novedades!

Autor: | Última modificación: 11 de noviembre de 2022 | Tiempo de Lectura: 2 minutos
Temas en este post: ,

Mogenerator es una herramienta esencial para cualquiera que desarrolla con Core Data y por ello siempre enseño su uso en mis cursos de programación iOS. Sin embargo, hacía ya mucho tiempo que no salía una nueva versión y mucho ha cambiado en programación para iOS: ARC es ya la opción por defecto, el nuevo sistema de módulos para importar código y por supuesto, Swift.

Pues bien, ha salido una nueva versión y es una actualización imprescindible. A fecha de hoy (Septiembre de 2014) aun no está actualizada la «receta» de home brew. Por lo tanto, has de instalarlo desde este enlace: mogenerator 1.28. Recuerda eliminar la versión antigua que puedas tener, como por ejemplo la de Home Brew.

Objective C Moderno

Con la nueva versión, se genera código de Objective C moderno. ¿Qué quiere decir esto? Pues además de ARC, se usan los módulos y los literales (si hace falta). Para ello, solo tenemos que indicar que queremos código de Objective C 2.0:

mogenerator -m  --v2

Código de Core Data en Swift

Ya podemos usar mogenerator para generar código Swift! Esta opción es aun experimental y recomiendo no usarla en producción, pero es un paso en la dirección correcta.

Para ello, tenemos que pasarle la opción –swift.

Enumeraciones como tipos

Para lo último, me he dejado lo mejor, o al menos lo que más esperaba: el poder usar enumeraciones como tipos en el código que genera mogenerator. Me explico…

Supongamos que tienes una entidad llamada AGTRatedThing y una de sus propiedades es un «rating» que aporta el usuario. Los valores de ese rating vienen en una enumeración con la siguiente pinta:

typedef NS_ENUM(uint16_t, AGTThingRating) {
    AGTThingRatingSucks,
    AGTThingRatingMeh,
    AGTThingRatingYay,
    AGTThingRatingRocks
};

Con el typedef, defino un nuevo tipo llamado AGTThingRating que tiene esos 4 valores posibles. Ahora bien, ¿como puñetas le digo yo a Mogenerator que la propiedad rating del _AGTRatedThing que va a generar es de tipo AGTThingRating y no un entero, como pone en el modelo de datos?

Mala pinta tiene la cosa, porque el modelo de datos solo conoce los tipos de SQLite y no los que me invento yo…

La solución está en el la posibilidad que nos brinda Core Data de añadir a las entidades y a los atributos un diccionario llamado UserInfo.

userInfo: mogenerator

Mediante el UserInfo de la entidad, le podemos decir en qué fichero está definido el typedef. Luego, mediante el UserInfo de rating, le indicaremos como se llama el typedef que necesita rating.

Las claves son las siguientes:

En la entidad especificamos el fichero de cabecera que hay que importar

La clave ha de ser additionalHeaderFileName y su valor (en este caso) ThingEnums.h

En el atributo especificamos el nombre del typedef

La clave ha de ser attributeValueScalarType y su valor AGTThingRating (en este caso).

Con esto, mogenerator nos va a generar una propiedad ratingValue de tipo AGTThingRating, que es lo que deseábamos desde un principio:

@property (atomic) AGTThingRating ratingValue;
- (AGTThingRating)ratingValue;
- (void)setRatingValue:(AGTThingRating)value_;

Para ello lo llamaríamos de la siguiente forma:

mogenerator -m EnumsAsTypes.xcdatamodeld/EnumsAsTypes.xcdatamodel/ --v2