Kevin Daniel Mora Gonzalez
Unit = void
Salvador Isaias Dueñas Urrutia
Int = int
David Galicia Gomez
Gracias,
¿Cómo crear una función básica en Kotlin?
Comenzar a familiarizarse con la creación de funciones en Kotlin es el primer paso para dominar este lenguaje. Crear una función en Kotlin es una habilidad esencial para cualquier desarrollador que busca escribir código eficiente y bien estructurado.
Para crear tu primera función en Kotlin, sigue los siguientes pasos:
main para asegurar su accesibilidad global.fun seguida del nombre de la función y los parámetros necesarios.: Tipo.Ejemplo básico de función en Kotlin
Vamos a ver un ejemplo sencillo en Kotlin, donde se crea una función que convierte una frase a mayúsculas o minúsculas dependiendo de un número aleatorio:
fun randomCase(frase: String): String { val resultadoAleatorio = (0..99).random() return if (resultadoAleatorio.rem(2) == 0) { frase.toUpperCase() } else { frase.toLowerCase() } } fun main() { val frase = "En Platzi nunca paramos de aprender" println(randomCase(frase)) }
¿Qué es una función de retorno Unit y cómo la utilizamos?
En Kotlin, una función que no devuelve ningún valor específico devuelve el tipo Unit, similar a void en otros lenguajes de programación. Aunque puedes omitir Unit en la declaración de la función, mencionarlo puede aclarar tus intenciones al escribir código.
fun imprimirFrase(frase: String): Unit { println("Tu frase es: $frase") }
¿Cómo funcionan las funciones de extensión en Kotlin?
Las funciones de extensión en Kotlin te permiten añadir funcionalidad a un tipo existente sin tener que heredar de él o modificar su código original. Imagina que puedes añadir métodos personalizados a tipos estándar, haciendo tu código más limpio y fácil de gestionar.
Creación de una función de extensión
Para crear una función de extensión, usas la misma sintaxis de una función normal, pero precedida por el tipo al que deseas añadir la extensión:
fun String.randomCase(): String { val resultadoAleatorio = (0..99).random() return if (resultadoAleatorio.rem(2) == 0) { this.toUpperCase() } else { this.toLowerCase() } }
Prueba y ejecución de las funciones
Ahora, vamos a probar cómo funciona esta función de extensión llamándola desde un objeto String:
fun main() { val frase = "Aprende siempre algo nuevo" println(frase.randomCase()) }
Estas prácticas funciones mejoran la legibilidad del código y hacen más intuitiva la utilización de métodos específicos para las clases existentes. Adoptar funciones de extensión y comprender las bases de las funciones en Kotlin es un paso valioso hacia el dominio del desarrollo de software. Anímate a implementar estas técnicas en tus futuros proyectos y verás un notable avance en la organización y eficiencia de tu código.
¡Sigue explorando y aprendiendo nuevas prácticas para convertirte en un mejor desarrollador! La robustez y claridad en el código son aspectos que tus colegas y futuros empleadores apreciarán enormemente.
Kevin Daniel Mora Gonzalez
Unit = void
Salvador Isaias Dueñas Urrutia
Int = int
David Galicia Gomez
Gracias,
Ramiz Perez Ordoñez
toUpperCase() y toLowerCase() han sido marcadas como obsoletas. En su lugar recomienda usar: uppercase() y lowercase()
Hugo Ponce
Gracias, me estaba marcando un error y no sabia porque era
facundo di paolo
Gracias.
++Funciones de extensión en Kotlin++ Las funciones de extensión (o extension functions en inglés) son funciones que, como su propio nombre indica, nos ayudan a extender la funcionalidad de clases sin necesidad de tocar su código. Ahora vamos a ver cómo se definen estas funciones, y algunos ejemplos que a mí personalmente me resultan muy útiles.
++¿Cómo se define una función de extensión?++ Tan solo hay que escribir una función como lo harías normalmente, y ponerle delante el nombre de la clase separado por un punto.
Ejemplo muy sencillo: queremos hacer que una vista tenga la función visible(), que la hace visible. Escribiríamos algo como esto:
fun View.visible() { this.visibility = View.VISIBLE } El this lo he puesto para que veas que podemos usar las funciones y propiedades de esa clase como si estuviéramos dentro de la propia clase, pero lo puedes omitir: fun View.visible() { visibility = View.VISIBLE }
++Algunos ejemplos interesantes++ Hay un par de ejemplos que me gusta poner, porque resumen muy bien la potencialidad de esto.
El primero es cuando estás inflando una vista dentro de un adapter. Normalmente utilizarías algo así:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.view_item, parent, false) return ViewHolder(v) } La línea que infla la vista y usa el parent es demasiado compleja, y el 99% de las veces suele ser igual en cualquier adapter. ¿Por qué no hacer que los ViewGroup puedan inflar vistas? fun ViewGroup.inflate(layoutRes: Int): View { return LayoutInflater.from(context).inflate(layoutRes, this, false) }
Ahora ya puedes utilizarlo en el código de arriba:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val v = parent.inflate(R.layout.view_item) return ViewHolder(v) }
Un ejemplo muy parecido se puede hacer con las imágenes. Si utilizas por ejemplo la librería de Picasso, necesitas andar haciendo el típico ritual:
Picasso.with(imageView.context).load(url).into(imageView)
¿Qué te parecería poder decirle a ImageView que cargue una url directamente?
fun ImageView.loadUrl(url: String) { Picasso.with(context).load(url).into(this) } imageView.loadUrl(url)
++Propiedades de extensión++ Igual que puedes hacer funciones de extensión, lo mismo puedes hacer con properties. Lo único que no podrán guardar un estado propio, sino valerse de las funciones ya existentes para modificar el estado:
val ViewGroup.children: List get() = (0..childCount -1).map { getChildAt(it) }
Esta property recupera los hijos de un ViewGroup
Ahora podrías iterar sobre ellos directamente:
parent.children.forEach { it.visible() } Nota: it es una palabra reservada que se utiliza para acceder al valor de entrada de la función, cuando solo hay uno. Como ya hemos visto en otros artículos, se pueden nombrar esos valores de entrada, y asignar más cuando hay más de uno.
++Conclusión++ Con las funciones y las propiedades de extensión puedes extender cualquier librería a la que no tengas acceso y luego utilizar esas funciones y propiedades como si fueran propias de la clase. Lo único que verás es un import extra en el archivo en el que se use.
Si de verdad vas en serio con Kotlin y, como yo, piensas que es el lenguaje del futuro en Android, te recomiendo que le eches un vistazo al training gratuito, donde te contaré todo lo que necesitas para aprender a crear tus Apps Android en Kotlin desde cero.
fuente:https://devexperto.com/funciones-extension-kotlin-android/
Alex Padilla
Genial !!!...Lo de la función extendida me encantó, kotlin es como un java con superpoderes
Jeisson Santiago Cortes Ortiz
Hoy en dia kotlin ya no usa toUpperCase() sino que se reemplazo por uppercase()
Yesid Alejandro Peláez Posada
La coloqué en mi código y me dice que esta función es experimental.
Michael Steven García García
La función "rem" hace lo mismo que "%"??
Giuseppe Vetri
ProfesorEs correcto Steven :)
César Augusto Calad Hernández
Mi aporte:
import java.util.* fun main(args: Array<String>) { val fraseAleatoria = "En Platzi nunca paramos de aprender".randomCase() imprimirFrase(fraseAleatoria) } fun imprimirFrase(frase : String){ println("Tu frase es: $frase") } fun String.randomCase() : String{ val numeroAleatorio = 0..99 val resultadoAleatorio = numeroAleatorio.random() return if (resultadoAleatorio.rem(2) == 0) { this.uppercase() } else { this.lowercase() } }
Bcanon@diamante.com.gt
Podemos reducir la linea de código del random a una sola de esta manera.
fun main(args: Array<String>) { val wordRandom = readLine() ?: "Nunca pares de aprender" println(randomCase(wordRandom)) } fun randomCase(word: String): String { val random = (0..99).random() return if (random.rem(2) != 0) { word.lowercase() } else word.uppercase() }
Yohan Arias
Sería más sencillo generar un número aleatorio 0..1 y dependiendo del que salga se usa una u otra condición sin necesidad de estar dividiendo
Eduardo Latorre
Las funciones de extensión es añadir métodos a las clases sin tocar la clase.
Rene Gomez
fun callMyFunction() { println("Nunca Pares de aprender".convertToAsterisk()) } fun String.convertToAsterisk() : String { return "*".repeat(this.length) }
Usuario anónimo
UserCódigo de la clase :)
fun main( ){ val fraseAleatoria = "Hola".randomCase() imprimirFrase(fraseAleatoria) } fun imprimirFrase(fraseAleatoria: String){ println(fraseAleatoria) } fun String.randomCase() : String { val numAleatorio = 0..99 val resAleatorio = numAleatorio.random() //modulo es rem return if(resAleatorio.rem(2)==0){ this.toUpperCase() }else{ this.toLowerCase() } }
Cristian David Restrepo Marin
un main( ){ val fraseAleatoria = "Hola".randomCase() imprimirFrase(fraseAleatoria) } fun imprimirFrase(fraseAleatoria: String){ println(fraseAleatoria) } fun String.randomCase() : String { val numAleatorio = 0..99 val resAleatorio = numAleatorio.random() return if(resAleatorio.rem(2)==0){ this.toUpperCase() }else{ this.toLowerCase() } }
Julian Alejandro Sarmiento Linares
Me encanto la función extendida, Kotlin si que facilita el trabajo muchas veces y deja el codigo bien presentado y optimizado
John Alassio
Esta bien tenemos que declararla fuera de la funcion main... pero porque??
Alejandro Lozano Medina
¿Cual les la utilidad de las funciones de extensión?
Giuseppe Vetri
ProfesorLas funciones de extensión te permiten agregar funcionalidades que no existen todavía. Imaginate que te dan un código de una librería y para inicializarlo tienes que usar siempre las mismas propiedades, con las funciones de extensión puedes evitar repetir los mismos pasos siempre y crearte tu propia función como si estuvieras "dentro" de la librería. Hay muchas opciones depende de la creatividad de como se usen.
Adrian Ducuara Benitez
Hey tengo una pregunta cual de las siguientes maneras en todos los lenguajes recomiendan para retornar el valor de una varible dentro de una condición:
if(true) { return mensaje = "Hola" } else { return mensaje = "ups" }
var mensaje = "" if(true) { mensaje = "Hola" } else { mensaje = "ups" } return mensaje
Jose Adriel Madrigal Gonzalez
Erick Adrián Reyes Rosario
Andres Bustamante
No conocía ell uso de las funciones de extensión, genial!
Tambien puedes optar por las otras dos opciones
Con el operador ternario
return (true) ? "Hola" : "ups"
Y el return del else puede omitirse porque sino se cumple la condición aun caería en el return
if (true) { return "Hola"; } return "ups"
Creo que ya depende del lugar donde trabajes y de la convención que tengan, porque me ha tocado trabajar con esas opciones dependiendo de la convención usada en ese lugar, espero te ayude! Saludos
fun main() { val phrase = "I want to learn Kotlin".randomCase() printPhrase(phrase) } fun printPhrase(phrase: String) { println("Your phrase is: $phrase") } fun String.randomCase(): String { val randomNumber = 0..99 val randomResult = randomNumber.random() return if (randomResult.rem(2) == 0) { this.uppercase() } else { this.lowercase() } } ```fun main() {   val phrase = "I want to learn Kotlin".*randomCase*()   *printPhrase*(phrase) } fun printPhrase(phrase: String) {   *println*("Your phrase is: $phrase") } fun String.randomCase(): String {   val randomNumber = 0..99   val randomResult = randomNumber.*random*()   return if (randomResult.rem(2) == 0) {   this.*uppercase*()   } else {   this.*lowercase*()   } }