En Kotlin, ¿hay un equivalente al código Swift a continuación?
if let a = b.val {
}
else {
}
Puede usar la let
funció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 run
funció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 run
bloque se evaluará si b
es nulo o si let
-block se evalúa comonull
.
Debido a esto, normalmente solo quieres una if
expresión.
val a = if (b == null) {
// ...
} else {
// ...
}
En este caso, el else
-block solo se evaluará si b
no es nulo.
a
No se puede acceder al interiorlet
y alrun
bloque.a
aún no está definido dentro del alcance delet
yrun
. Pero puede acceder al valor deb
dentro dellet
con el parámetro implícitoit
. Esto tiene el mismo propósito, supongo.a
antes de esos bloques de código. Ya
se puede acceder al interior.a
? Si es asíb
, entoncesit
tiene exactamente el mismo propósito. ¿Se reasignaa
con el resultado delval
-bloque?it
desde dentro dellet
bloque. El resultado del bloquelet
orun
se asignará aa
. El resultado es la última expresión del bloque. Utiliza la tarea después de quelet
/run
ha 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ímboloa
ligado al valor no envuelto. De lo contrario, ingrese alelse
bloque.Especialmente tenga en cuenta que
a
está limitado solo dentro delthen
bloque . En Kotlin puede obtenerlo fácilmente llamandoy puede agregar un
else
bloque 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
let
lugar dealso
significa que elrun
bloque se ejecutará siempre que ellet
bloque 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 let
declaración.La
Optional Binding
(llamadaif-let
declaració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 Binding
para laif-let
declaració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
let
funció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 let
declaración.guard-let
declaración en Swift es simple y poderosa. Comprueba si hay alguna condición y si se evalúa como falsa, entonces seelse
ejecuta 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
name
no es nulo:fuente
let
hace, pero la pregunta es sobre laelse
estrategia que se ejecuta si el objeto en el quelet
se 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