Dans Kotlin, existe-t-il un équivalent du code Swift ci-dessous?
if let a = b.val {
}
else {
}
Vous pouvez utiliser la fonction let
- comme ceci:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Notez que vous devez appeler la fonction run
uniquement si vous avez besoin d'un bloc de code. Vous pouvez supprimer le bloc run
- si vous ne disposez que d'un oneliner après l'opérateur elvis (?:
).
Sachez que le bloc run
sera évalué si b
est null ou si le let
- block est évalué à null
.
Pour cette raison, vous voulez généralement juste une expression if
.
val a = if (b == null) {
// ...
} else {
// ...
}
Dans ce cas, le bloc else
- ne sera évalué que si b
est null.
Veillons d'abord à bien comprendre la sémantique de l'idiome Swift fourni:
if let a = <expr> {
// then-block
}
else {
// else-block
}
Cela signifie: "si le <expr>
donne un non-nil optionnel, entrez le bloc then
- avec le symbole a
lié à la valeur non enveloppée. Sinon, entrez le bloc else
.
Notez en particulier que a
est lié uniquement dans le then
- block . À Kotlin, vous pouvez facilement obtenir cela en appelant
<expr>?.also { a ->
// then-block
}
et vous pouvez ajouter un bloc else
- comme ceci:
<expr>?.also { a ->
// then-block
} ?: run {
// else-block
}
Cela donne la même sémantique que l'idiome Swift. Cependant, il y a toujours une différence dans le cas où vous voudriez traiter l'idiome entier comme une expression et récupérer son résultat, ainsi dans Swift:
let result = if let a = <expr> {
// then-block
}
else {
// else-block
}
Si result
est d'un type non optionnel, vous pouvez utiliser cet idiome:
val result = <expr>?.let { a ->
// then-block
} ?: run {
// else-block
}
Cela fonctionne de manière indirecte: nous calculons une valeur non nulle, donc <expr>?.let {...}
évaluant à null
signifie <expr>
évalué à null
.
Pour le cas tout à fait général qui fonctionne pour des résultats nullables, je ne pouvais pas trouver un moyen naturel de l'exprimer dans Kotlin sans laisser a
au périmètre situé en dehors du bloc then
-.
Voici comment exécuter du code uniquement lorsque name
n'est pas null:
var name: String? = null
name?.let { nameUnwrapp ->
println(nameUnwrapp) // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
println(nameUnwrapp) // printed "Alex"
}
Contrairement à Swift, il n'est pas nécessaire de déballer l'option avant de l'utiliser dans Kotlin. Nous pourrions simplement vérifier si la valeur est non nulle et si le compilateur suit les informations sur le contrôle que vous avez effectué et permet de l’utiliser comme non-enveloppé.
En rapide:
if let a = b.val {
//use "a" as unwrapped
} else {
}
À Kotlin:
if b.val != null {
//use "b.val" as unwrapped
} else {
}
Référez-vous Documentation: (null-safety) pour plus de cas d'utilisation
Ma réponse est totalement une copie de chat des autres. Cependant, je ne peux pas comprendre leur expression facilement. Je suppose donc que ce serait bien de fournir une réponse plus compréhensible.
En rapide:
if let a = b.val {
//use "a" as unwrapped
}
else {
}
À Kotlin:
b.val?.let{a ->
//use "a" as unwrapped
} ?: run{
//else case
}
if let
.L'attribut Optional Binding
de Swift (ainsi appelé instruction if-let
) permet de déterminer si un facultatif contient une valeur et, le cas échéant, de rendre cette valeur disponible sous forme de constante ou de variable temporaire. Ainsi, un Optional Binding
pour l'instruction if-let
est le suivant:
L'instruction
if-let
de Swift:
let b: Int? = 50
if let a = b {
print("Good news!")
} else {
print("Equal to 'nil' or not set")
}
/* RESULT: Good news! */
Dans Kotlin, comme dans Swift, pour éviter les plantages causés par la tentative d’accès à une valeur nulle alors qu’elle n’était pas attendue, une syntaxe spécifique (telle que b.let { }
dans le deuxième exemple) est fournie pour décompresser correctement nullable types
:
Équivalent Kotlin 1 de l'instruction
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 fonction let
de Kotlin, lorsqu'elle est utilisée en combinaison avec l'opérateur ?:
de l'appel sécurisé, fournit un moyen concis de gérer les expressions nullables.
Équivalent Kotlin 2 _ (Fonction let inline et opérateur Elvis)} de l'instruction
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
.L'instruction guard-let
dans Swift est simple et puissante. Il vérifie la présence d'une condition et, s'il est faux, l'instruction else
est exécutée et permet normalement de quitter une méthode.
Explorons l'instruction
guard-let
de 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 */
Effet similaire de Kotlin de l'instruction
guard-let
de Swift:
Contrairement à Swift, dans Kotlin, il n’ya aucune déclaration de guard. Cependant, vous pouvez utiliser le Elvis Operator
- ?:
pour obtenir un effet similaire.
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! */
J'espère que cela t'aides.