
Objective-C + Swift
Swift ya lleva tiempo en el terreno, aproximadamente 1 año y medio, e inclusive Apple lo hizo Open Source, pudiendo portarlo a Ubuntu, mientras tanto en 1 año, Objective-C se desplomo 15 posiciones en el indice TIOBE, de estar en el 3er lugar de lenguajes mas usados junto con Java, C, C++ y C#, paso al 18 y Swift escalo 11 posiciones, ubicandose en el 14.
En mi opinión, Objective-C es un lenguaje muy poderoso, tiene mucha base de código, pero Swift nos ofrece muchas ventajas, sobre todo en el aspecto funcional, la posibilidad de crear clases Genericas, nos ahorra mucho trabajo a bajo nivel.
Uno de las tareas más comunes que tenemos como desarrolladores, es la interacción con API’s de servicios de terceros o bien, Servicios de nuestro mismo cliente/negocio.
Un response muy comun que tendriamos que manejar sería un success en un login por ejemplo:
{
firstName: "John",
lastName: "Doe",
email: "john.doe@mail.com"
}
En Swift tendriamos un modelo que nos permita guardar esta información:
class User {
var firstName:String = ""
var lastName:String: = ""
var email:String = ""
class func createFromDictionary(attributes:[String:AnyObject]) -> User {
var user = User()
if let firstName = info["firstName"] as? String {
user.firstName = firstName
}
if let lastName = info["lastName"] as? String {
user.lastName = lastName
}
if let email = info["info"] as? String {
user.email = email
}
return user
}
}
Esta clase, basicamente hace su trabajo, con el guardariamos el response anterior, sin embargo tiene algunos puntos debiles, los cuales son:
- Si tu response JSON es modificado, ya sea se agregan propiedades, o se remueven, tendriamos que actualizar nuestro código.
- Se va a necesitar escribir código cada que creemos un nuevo modelo.
Para esto, aprovecharemos los principios basicos de Key-Value Coding, para asi poder limpiar un poco nuestro modelo mediante una extensión de NSObject, y así tener un modelo mas delgado y dinamico, tambien podría ser valido crear un modelo base y heredar de el.
class User: NSObject {
var firstName:String = ""
var lastName:String = ""
var email:String = ""
}
extension NSObject {
class func createFromJson(attributes: NSDictionary) -> Self {
var obj = self()
(obj as NSObject).load(attributes)
return obj
}
func load(attributes: NSDictionary) {
for(key, value) in attributes {
let keyName = key as String
if(self.respondsToSelector(NSSelectorFromString(keyName))) {
self.setValue(value, forKey: keyName)
}
}
}
}
Con este pequeño código, nos permite tener nuestro modelo mas generico, podemos actualizar nuestra API y actualizar solamente el modelo, para agregar/quitar propiedades, sin tener el temor de que se rompa, simplemente tenemos que heredar de NSObject o de la clase creada, si se opto por crear un BaseModel
let json = [
firstName: "John",
lastName: "Doe",
email: "john.doe@mail.com"
]
var user = User.createFromJson(json)
println(user.firstName) // John
println(user.lastName) // Doe
println(user.email) // john.doe@mail.com
Espero que les sea util este pequeño tip, como siempre, pueden contactarme a mi Twitter en: @tavobarrientos.