Funciones de Extensión en Kotlin

En muchas ocasiones una clase no tiene todas las funcionalidades que nos gustaría. La solución que solemos usar es crear una nueva clase que herede de ella y posteriormente agregamos todos los atributos y métodos que necesitamos.
Aunque lo anterior funciona resulta ser exagerado en varios escenarios.
¿Para qué crear una clase completamente nueva cuando sólo necesitamos un método extra?
Los desarrolladores de Kotlin se dieron cuenta de este problema e introdujeron las Extension Functions
Funciones de Extensión en Kotlin
Las Extension Functions(a las que me referiré en este artículo como Funciones de Extensión) nos ayudan a agregar funcionalidad extra a una clase.
Digamos que necesitamos intercambiar los valores de dos elementos en un arreglo. En lenguajes como java creariamos un método estático que nos ayude a realizar esta labor parecido al siguiente:
private static void swap(int[] array, int indice1, int indice2){
int temp = array[indice1];
array[indice1] = array[indice2];
array[indice2] = temp;
}Y para llamarlo:
int[] array = {1,2,3,4,5,6};
swap(array, 0, 1);¿No sería mejor tener un método dentro de la clase array que hiciera esta tarea?
LLegan las Funciones de Extensión al Rescate

Con las funciones de extensión podemos agregar funcionalidad directo al arreglo de enteros sin necesidad de crear un método estático. Esto permite que el código sea mucho más legible y que el principio de la responsabilidad única se mantenga.
El código en Kotlin se vería similar a esto:
fun IntArray.swap(index1:Int, index2:Int){
val tmp = this[index1]//En este caso this hace referencia al objeto receptor
this[index1] = this[index2]
this[index2] = tmp
}Y podemos llamar a este método desde la instancia de nuestro arreglo utilizando la notación de punto que ya todos conocemos:
val numeros = intArrayOf(4,2,4,5,1,8,9,10)
numeros.swap(0, numeros.lastIndex) //Ahora numeros contiene [10,2,4,5,1,8,9,4]De esta forma los arreglos hacen su chamba y otras clases se ocupan de sus propios asuntos.

Si Quieres Saber Más…
Puedes leer la documentación oficial sobre Extension Functions aquí
