for - Rápido si deja la declaración en Kotlin
kotlin vs java (7)
if let
declaración.
El
Optional Binding
de Swift (llamado enunciado
if-let
) se usa para averiguar si un opcional contiene un valor y, de ser así, hacer que ese valor esté disponible como una constante o variable temporal.
Entonces, un
Optional Binding
para la instrucción
if-let
es el siguiente:
La declaración
if-let
Swift:
let b: Int? = 50
if let a = b {
print("Good news!")
} else {
print("Equal to ''nil'' or not set")
}
/* RESULT: Good news! */
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 correctamente
nullable types
:
Kotlin equivalente 1 de la declaración
if-let
de Swift:
val b: Int? = null
val a = b
if (a != null) {
println("Good news!")
} else {
println("Equal to ''null'' or not set")
}
/* RESULT: Equal to ''null'' or not set */
La función
let
de Kotlin, cuando se usa en combinación con el operador de llamada segura
?:
, Proporciona una forma concisa de manejar expresiones anulables.
Kotlin equivalente 2 (función let en línea y operador de Elvis) de la declaración
if-let
de Swift:
val b: Int? = null
val a = b.let { nonNullable -> nonNullable } ?: "Equal to ''null'' or not set"
println(a)
/* RESULT: Equal to ''null'' or not set */
guard let
declaración.
guard-let
declaración
guard-let
en Swift es simple y poderosa.
Comprueba si hay alguna condición y si se evalúa como falsa, se ejecuta la instrucción
else
que normalmente saldrá de un método.
Exploremos la declaración de
guard-let
Let Swift:
let b: Int? = nil
func testIt() {
guard let a = b else {
print("Equal to ''nil'' or not set")
return
}
print("Good news!")
}
testIt()
/* RESULT: Equal to ''nil'' or not set */
El efecto similar de Kotlin de la declaración de
guard-let
de Swift:
A diferencia de Swift, en Kotlin, no hay ninguna declaración de
guardia
.
Sin embargo, puede usar el
Elvis Operator
-
?:
Para obtener un efecto similar.
val b: Int? = 50
fun testIt() {
val a = b ?: return println("Equal to ''null'' or not set")
return println("Good news!")
}
testIt()
/* RESULT: Good news! */
Espero que esto ayude.
En Kotlin, ¿hay un equivalente al código Swift a continuación?
if let a = b.val {
}
else {
}
A diferencia de Swift, no es necesario desenvolver lo opcional antes de usarlo en Kotlin. Podríamos verificar si el valor no es nulo y el compilador rastrea la información sobre la verificación que realizó y permite usarlo como desenvuelto.
En Swift:
if let a = b.val {
//use "a" as unwrapped
}
else {
}
En Kotlin:
b.val?.let{a ->
//use "a" as unwrapped
} ?: run{
//else case
}
Consulte la documentación: (seguridad nula) para más casos de uso
Aquí se explica cómo ejecutar solo el código cuando el
name
no es nulo:
var name: String? = null
name?.let { nameUnwrapp ->
println(nameUnwrapp) // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
println(nameUnwrapp) // printed "Alex"
}
Hay una forma similar en Kotlin para lograr el estilo de Swift if-let
if (val a = b) {
a.doFirst()
a.doSecond()
}
También puede asignar múltiples valores anulables
if (val name = nullableName, val age = nullableAge) {
doSomething(name, age)
}
Este tipo de enfoque será más adecuado si los valores anulables se usan más de 1 vez. En mi opinión, ayuda desde el aspecto del rendimiento porque el valor anulable se verificará solo una vez.
fuente: Discusión de Kotlin
Mi respuesta es totalmente una copia del gato de los demás. Sin embargo, no puedo entender su expresión fácilmente. Así que supongo que sería bueno proporcionar una respuesta más comprensible.
En rápido:
if let a = b.val {
//use "a" as unwrapped
} else {
}
En Kotlin:
if b.val != null {
//use "b.val" as unwrapped
} else {
}
Primero asegurémonos de comprender la semántica del idioma Swift proporcionado:
if let a = <expr> {
// then-block
}
else {
// else-block
}
Significa esto: "si el
<expr>
resulta en una opción no nula, ingrese el bloque-
then
con el símbolo
a
enlace al valor desenvuelto. De lo contrario, ingrese el bloque
else
.
Especialmente tenga en cuenta que
a
está limitado
solo dentro del bloque-
then
.
En Kotlin puede obtener esto fácilmente llamando
<expr>?.also { a ->
// then-block
}
y puedes agregar un bloque
else
como este:
<expr>?.also { a ->
// then-block
} ?: run {
// else-block
}
Esto da como resultado la misma semántica que el idioma Swift.
Puede usar la función
let
esta manera:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Tenga en cuenta que debe llamar a la función de
run
solo si necesita un bloque de código.
Puede eliminar el bloque de
run
si solo tiene un marcador de línea después del operador elvis (
?:
:).
Tenga en cuenta que el bloque de
run
se evaluará si
b
es nulo o si
let
-block se evalúa como
null
.
Debido a esto, generalmente solo quieres una expresión
if
.
val a = if (b == null) {
// ...
} else {
// ...
}
En este caso, el bloque
else
solo se evaluará si
b
es nulo.