Archive for the ‘Objective-C’ Category

Si mi mente no es estática, mi tipado tampoco debería serlo…

Despues de haber leído el articulo de Fernando en Cocoa Mental, se me ocurrió retuiterarlo…y me vi inmerso en un debate con unos interlocutores a los cuales en principio no iba destinado el dardo del autor.

Fernando apuntaba a “Javeros” y “Cpluspluseros”…pero fueron en mayoria “.neteros” (hoy estoy “sembrao” con los palabros) los que se dieron por aludidos, y principalmente usuarios de C#.

Para los que no me conozcáis llevo desde los 10 años rascando código, y voy a cumplir 35 dentro de un mes, y si bien la cantidad y la calidad son los mismo que el tocino y la velocidad, os ruego que hagáis un “auto de fe” sobre lo que os quiero explicar, y al final del post saquéis vuestras propias conclusiones.

En mi día a día principalmente me peleo con .NET y con ObjC+Cocoa, aunque también tengo que entrar al trapo en otras guerras, pero estas no nos aportarían demasiado para el tema que quiero tocar aquí.

Así que, vamos a meternos en harina…

Al contrario que Fernando…veo mas similitudes que diferencias en las dos plataformas que toco, y creo que podemos extrapolar ese pensamiento a todas las plataformas actuales…ahora me explico… ;)

Todas han sido ideadas (con mayor o menor fortuna) para solucionar problemas estándar…y nos ponen en la manos unas herramientas que yendo por la línea  rápida y recta, o dando un largo rodeo…nos permiten (al menos que seamos unos patanes integrales) llegar al mismo sitio…

-Unos harán ese camino dejando suciedad por todos sitios y dando saltitos de aquí para allí mientras caminan…

-Otros irán limpiando el camino y tomando apuntes, incluso dejando miguitas de pan para los que lleguen después…

-Otros, lo harán acompañados de gente y de manera ordenada (estos irán en carreta, turnándose para tirar de la misma y conseguirán cansarse menos)

-Los hay que preferían no hacer ese camino sin consultar previamente los mapas, leerán los apuntes de algún viajero anterior…estudiaran la mejor manera de llegar y verán que con un estricto análisis se podía tomar un atajo que evite pasar una y otra vez por la misma encrucijada…

Al final todos se encuentran delante de una puerta  y pueden abrirla con una llave, o de una pedrada, pero los dos métodos te permitirán entrar

Como veis existen múltiples maneras de hacer las cosas…y eso es común para todas las plataformas…

Bien…a estas alturas del post os estaréis preguntando hacia donde os quiero llevar…seguirme, que ya queda menos… ;)

Los lenguajes y las plataformas, no dejan de evolucionar. Cada una a su ritmo…pero observándose mutuamente…

Si alguno tiene algo realmente bueno, el otro intentara asimilarlo dentro de su core, o implementara algún tipo de “parche” o invento para conseguir el mismo fin…y eso esta pasando constantemente…

Por ejemplo uno de los creadores de Java era un fanático de la plataforma NEXT y se llevo cosas de Objective-C para su nuevo lenguaje.

Un ejemplo técnico sencillo es el tema de los auto-synthetize que nos ahorra unas líneas de código en Objective-C…pues eso existía integrado desde hacia un tiempo antes en .NET, donde declarando las property de una cierta manera se nos generan “por detrás” los getters y los setters necesarios para acceder a ellas…

El otro día descubrí (buscando otra cosa) como “atacar” colecciones de datos con querys’s estilo “SQL” en Objective-C me pareció súper potente para ciertos asuntos…y profundizando en esa búsqueda,  también me di cuenta que eso mismo, se podía hacer en .NET desde la versión 4 del framework atacando los datos con LINQ y con una sintaxis también sospechosamente parecida a SQL

Muchos estaréis pensando que si, que todo muy bonito…pero que, en esencia, el tema de los tipados si que separa a las dos plataformas de manera total…o no?¿

Pues si, y no, una vez más (seguid leyendo hasta el final del post, por favor… ;) xD)…

Para mi el tipado estático realmente representa una carga en el desarollo, y mas cuando has probado las mieles del dinamismo

Yo lidio todos los días con .NET…y puedo trabajar como lo haría con otro lenguaje con tipado dinámico…a eso se le llama “inferencia de tipos” que permite a los lenguajes funcionales soltar lastre y no ser tan estrictos…un buen ejemplo de esto es el lenguaje F# .

En .Net, a partir del framework 4.0 usando declaraciones del tipo “dynamic” el compilador no se queja y manda la llamada necesaria al nuevo motor de ejecución DLR (Dynamic Language Runtime) en lugar del clásico CLR (Common Language Runtime). Y si nos paramos a pensar, antes usando “reflexión” también podíamos  hacer algo parecido (usando Get types), aunque eso era algo mas feote… ;) xD

Por cierto ese nuevo DLR permite cosas muy chulas como ejecutar lenguajes dinámicos como Python (o deberíamos decir Iron Python) bajo .NET y integrarlo plenamente en Visual Studio con muy buenos resultados…

Una vez mas llegamos a lo mismo pero de distinta manera…y todo eso servirá para demostrar algo al final de todo (si no me lio dentro de mis propios pensamientos) ;)

En el post del que surge todo este embolao, Fernando califico a los patrones de diseño como : “una señal de ineficiencia”…

Estoy de acuerdo con esta afirmación?¿ Pues una vez mas si y no, y el que no llegue al final del post no sabrá porque… ;) xDDD

En .NET tenemos mucha libertad para rascar código…tenemos un IDE muy chulo (me encanta Xcode, pero VS2012 esta también muy bien) que permite fácilmente ponerte directamente a crear algo…pero eso no acostumbra a ser una buena idea…Y ahí entran los patrones de diseño…que no dejan de ser una “plantillas” para que no nos descarriemos mucho por el camino…

Y en que lugar deja esto a Objective-C? No usamos con el los patrones de diseño?¿

Pues en realidad si que los usamos y mucho, en casi todo momento…usamos el MVC, el delegado, el observador constantemente…y casi no nos damos cuenta de que lo hacemos…

Simplemente Objective-C y el IDE te empujan a usarlos sin darte cuenta…

Os recomiendo un libro que os ayudara sobre este tema especifico : Pro Design patterns for IOS ;)  y este otro que os servirá para todo…un imprescindible : Design patterns : Elements of reusable object oriented software.

Y ahí es donde quería llevaros desde el principio…

Para mi, el quid de la cuestión no es tanto el tipado, ni los patrones…sino el paradigma o la esencia en si de las propias plataformas y lenguajes

No es un algo, sino el conjunto, el todo, que las hace mejor o peor para conseguir un objetivo

La curva de aprendizaje de alguien que aprende Java o .NET es ascendente…fácil al principio y difícil según se complican las cosas…

Con Objective-C es totalmente a la inversa…te llevas un mazazo al intentar adentrarte en el…y cuando superas ese muro, ya puedes empezar a hacer cosas muy vistosas o complicadas en otras plataformas, sin apenas esfuerzos

Programar con Objective-C te hace tomar decisiones para solventar problemas de manera en cierto modo inducida,  o guiada (un poco como si te llevaran de la mano).

Desarrollas de una cierta manera, cambias la manera de pensar, de enfrentarte a los problemas…usas la potencia del lenguaje dinámico, la potencia al mas alto nivel de los patrones…y puede ser que nunca hayas profundizado ni te hayas interesado en leer nada sobre ninguna de las dos cosas…y sin embargo ahí estas…

Evidentemente, os recomiendo conocer lo mejor posible la plataforma que uséis para poder sacarle rendimiento…y no hacer las cosas por inercia…

Cuanto mas conozcas sobre datos, arquitectura de software, pros, contras, fuerzas y restricciones etc…en mejor profesional te convertirás…necesitas esa información para asimilarla y aplicarla correctamente…

Buenos developers y chapuzas los hay en todas las plataformas…

Pero una de las cosas que me a enseñado la vida, es que no los reconocerás por el lenguaje que dominen, por la plataforma que usen, los reconocerás por la apertura de miras que tengan, la curiosidad que presenten o las ansias de aprender que demuestren…

Por eso quizás el titulo de este post no sea del todo correcto, o quizás si…eso ya lo decidirás tu…

Amplia horizontes, prueba, tantea, estudia, experimenta, pero sobretodo que tu mente no se quede estática… ;)

 

Share

Objective-C : Conseguir la versión de una app

Con este código podremos conseguir la versión de una app que tenemos en el .plist :

NSString*	version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Share

Objective-C : Comparar un NSNumber

Aquí os dejo un snippet que os mostrara la manera de comparar un NSNumber.

//numberOne and numberTwo son 2 NSNumber
if (numberOne isEqualToNumber: numberTwo)
{
     NSLog(@"numberOne es igual a numberTwo");
}
if ([numberOne intValue] > [numberTwo intValue])
{
     NSLog(@"numberOne es superior a numberTwo");
}
Share

Objective-C : Dar formato a una fecha

Este snippet es de los que se usan corrientemente en cuanto te toca trabajar con fechas…con el podrás darles formato :

//Dar formato a la fecha
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"]; // 2013-02-01 21:33:33 PST
NSString *dateString = [dateFormat stringFromDate: [scoreData objectForKey: @"date"]];
Share

Objective-C : Abrir una URL en Safari

NSURL *url = [ [ NSURL alloc ] initWithString: @"http://www.google.com" ];
[[UIApplication sharedApplication] openURL:url];
Share

Objective-C : Contar numero de caracteres de una cadena

Una de las acciones comunes que se requieren al programar es la de contar los caracteres de una cadena.

Aquí os dejo un snippet en Objective-C que sirve exactamente para eso ;)

NSInteger strlength(NSString *str){
	NSRange r = [str rangeOfString:str];
	return r.length;
}
Share

Objective-C : Transiciones entre vistas en IOS

Pasar de una vista a otra de una manera mas vistosa no es muy complicado en IOS. Os dejo el siguiente Snippet que os servirá de guía.

-(IBAction) siguienteVista:(id) sender{
Vistanueva = [[pantallanueva alloc]
initWithNibName:@"Vistanueva" bundle:nil];

[UIView beginAnimations:@"flipping view" context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationTransition:
UIViewAnimationTransitionCurlUp
forView:self.view.superview cache:YES];
[self.view addSubview:Vistanueva.view];
[UIView commitAnimations];
}

Existen otros tipos de transición con los que puedes “jugar” os invito a probarlas… ;)

-UIViewAnimationTransitionNone
-UIViewAnimationTransitionFlipFromLeft
-UIViewAnimationTransitionFlipFromRight
-UIViewAnimationTransitionCurlUp
-UIViewAnimationTransitionCurlDown

Share

Objective-C : Detectar el carrier de nuestro Iphone

Si necesitáis saber con que carrier estáis conectando podéis importar “Core Telephony”

#import <CoreTelephony/CTTelephonyNetworkInfo.h>

Y usar este código para acceder a el :

CTTelephonyNetworkInfo *phoneInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *phoneCarrier = [phoneInfo subscriberCellularProvider];
NSLog(@"Carrier = %@", [phoneCarrier carrierName]);
[phoneInfo release];
Share

Objective-C : Mostrar el Network Activity Indicator

Si en alguna de tus apps para Iphone necesitas interactuar con el Network Activity Indicator, lo puedes hacer de una manera muy sencilla.

Para mostrarlo :

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Para ocultarlo :

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

 

Share

Objective-C : Usar la vibración del Iphone

Si queremos integrar la vibración en una app para el Iphone, solo tendremos que hacer un par de pasos.

1- Importar AudioToolbox

#import <AudioToolbox/AudioToolbox.h>

2-Hacer esta llamada :

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Share