jueves, 9 de octubre de 2014

Swift y Extensiones (Extensions)

Extensions añade nuevas funcionalidades a una clase existente, structure or un tipo enumeration.

Se declaran con la palabra clave extension.

extension NombreTipo {

  // nuevas funcionalidades a añadir

}

extension puede extender un tipo para que adopte uno más protocolos.

extension NombreTipo: ProtocoloUno, ProtocoloDos {

   // implementación de los protocolos requeridos van aquí

}


Si se define una extension para añadir nuevas funcionalidades a un tipo existente, la nueva funcionalidad estará disponible para todas las instancias existentes de ese tipo.


Propiedades Calculadas

En este ejemplo se añaden cuatro propiedades calculadas. Nuevas propiedades que multiplica por 2 y suma 2, multiplica por tres y suma 3 al valor indicado.

extension Double {

   var porDos: Double 

             return self * 2 
      }

   var masDos: Double { 

              return self + 2  
     }

   var porTres: Double { 

              return self * 3 
    }

   var masTres: Double { 

             return self + 3 
   }

}


10.2 es un double que puede obtener esas propiedades calculadas.

let valorPorDos = 10.2.porDos

println("10.2 * 2 =  \(valorPorDos)")

// Imprimirá 10.2 * 2 =  20.4


let valorPorTres = 10.2.porTres

println("10.3 * 3 =  \(valorPorTres)")

// Imprimirá 10.3 *32 =  30.9


También es posible realizar operaciones matemáticas.

let sumaValores = 1.0.porDos + 1.0.porTres

El resultado de suma varlores será de 5 ya que (1 * 2 + 1 * 3 = 5 )


Inicializaciones

extension pueden añadir inicializaciones a tipo existentes.

struct Distancia {
     var metros = 0.0
}

struct Temperatura {
    var grados = 0.0
}


struct Ciudad {
  
   var distancia = Distancia()
  
  var temperatura = Temperatura()

}


Se puede extender la estructura Ciudad para indicar valores de inicialización.


extension Ciudad {

     init(distanciaIn: Distancia, temperaturaIn: Temperatura) {
      
      // se calculan valores temporales
       let distanciaKm = distanciaIn.metros * 1000;
       let temperaturaMasUno =  temperaturaIn.grados + 1;

      // para después inicializar
      self.init(distancia: Distancia(metros:distanciaKm),
                                           temperatura: temperaturaMasUno)

      }
}











No hay comentarios:

Publicar un comentario