En Kotlin, ¿hay un equivalente al código Swift a continuación?
if let a = b.val {
}
else {
}Puede usar la letfunción -como esta:
val a = b?.let {
    // If b is not null.
} ?: run {
    // If b is null.
}Tenga en cuenta que debe llamar a la runfunción solo si necesita un bloque de código. Puede eliminar el run-block si solo tiene un delineador después del elvis-operator ( ?:).
Tenga en cuenta que el runbloque se evaluará si bes nulo o si let-block se evalúa comonull .
Debido a esto, normalmente solo quieres una ifexpresión.
val a = if (b == null) {
    // ...
} else {
    // ...
}En este caso, el else-block solo se evaluará si bno es nulo.
aNo se puede acceder al interiorlety alrunbloque.aaún no está definido dentro del alcance deletyrun. Pero puede acceder al valor debdentro delletcon el parámetro implícitoit. Esto tiene el mismo propósito, supongo.aantes de esos bloques de código. Yase puede acceder al interior.a? Si es asíb, entoncesittiene exactamente el mismo propósito. ¿Se reasignaacon el resultado delval-bloque?itdesde dentro delletbloque. El resultado del bloqueletorunse asignará aa. El resultado es la última expresión del bloque. Utiliza la tarea después de quelet/runha terminado, al igual que lo hace con cualquier otra tarea normal.Primero asegurémonos de entender la semántica del idioma Swift proporcionado:
Significa esto: "si el
<expr>resultado es un opcional no nulo, ingrese elthen-bloque con el símboloaligado al valor no envuelto. De lo contrario, ingrese alelsebloque.Especialmente tenga en cuenta que
aestá limitado solo dentro delthenbloque . En Kotlin puede obtenerlo fácilmente llamandoy puede agregar un
elsebloque como este:Esto da como resultado la misma semántica que el modismo Swift.
fuente
Mi respuesta es totalmente una imitación de los demás. Sin embargo, no puedo entender su expresión fácilmente. Así que supongo que sería bueno dar una respuesta más comprensible.
En rápido:
En Kotlin:
fuente
letlugar dealsosignifica que elrunbloque se ejecutará siempre que elletbloque regresenull, que no es lo que queremos.A diferencia de Swift, no es necesario desenvolver el opcional antes de usarlo en Kotlin. Podríamos simplemente verificar si el valor no es nulo y el compilador rastrea la información sobre la verificación que realizó y permite usarla sin empaquetar.
En Swift:
En Kotlin:
Consulte Documentación: (seguridad nula) para más casos de uso
fuente
if letdeclaración.La
Optional Binding(llamadaif-letdeclaración) de Swift se usa para averiguar si un opcional contiene un valor y, de ser así, para hacer que ese valor esté disponible como una constante o variable temporal. Entonces, unaOptional Bindingpara laif-letdeclaración es la siguiente:En Kotlin, como en Swift, para evitar bloqueos causados por intentar acceder a un valor nulo cuando no se espera, se proporciona una sintaxis específica (como
b.let { }en el segundo ejemplo) para desenvolver correctamentenullable types:La
letfunción de Kotlin , cuando se usa en combinación con el operador de llamada segura?:, proporciona una forma concisa de manejar expresiones que aceptan valores NULL.guard letdeclaración.guard-letdeclaración en Swift es simple y poderosa. Comprueba si hay alguna condición y si se evalúa como falsa, entonces seelseejecuta la declaración que normalmente saldrá de un método.A diferencia de Swift, en Kotlin, no hay ninguna declaración de guardia . Sin embargo, puede usar
Elvis Operator-?:para obtener un efecto similar.Espero que esto ayude.
fuente
A continuación, se explica cómo ejecutar código solo cuando
nameno es nulo:fuente
lethace, pero la pregunta es sobre laelseestrategia que se ejecuta si el objeto en el queletse llama esnull. Swift lo tiene de una manera más natural (discutible). Pero después de haber hecho mucho a Kotlin y Swift, desearía que Kotlin tuviera un desenvolvimiento simple como lo hace Swift.Aquí está mi variante, limitada al caso muy común "si no nulo".
En primer lugar, defina esto en alguna parte:
Probablemente debería serlo
internal, para evitar conflictos.Ahora, convierta este código Swift:
A este código de Kotlin:
Tenga en cuenta que, como siempre con los bloques en Kotlin, puede eliminar el argumento y usar
it:Pero si el bloque tiene más de 1-2 líneas, probablemente sea mejor ser explícito.
Esto es tan similar a Swift como pude encontrar.
fuente
Hay una forma similar en kotlin de lograr el estilo de Swift if-let
También puede asignar varios valores que aceptan valores NULL
Este tipo de enfoque será más adecuado si los valores que aceptan valores NULL se utilizan más de una vez. En mi opinión, ayuda desde el aspecto del rendimiento porque el valor anulable se comprobará solo una vez.
fuente: Discusión de Kotlin
fuente
Estoy agregando esta respuesta para aclarar la respuesta aceptada porque es demasiado grande para un comentario.
El patrón general aquí es que puede usar cualquier combinación de las funciones de alcance disponibles en Kotlin separadas por el operador de Elvis de esta manera:
Por ejemplo:
fuente
La opción más limpia en mi opinión es esta
Rápido:
Kotlin
fuente
La respuesta corta es usar IF-ELSE simple ya que en el momento de este comentario no hay equivalente en Kotlin LET,
fuente