Dans Kotlin, existe-t-il un équivalent au code Swift ci-dessous?
if let a = b.val {
}
else {
}
Vous pouvez utiliser la let
fonction comme ceci:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Notez que vous devez appeler la run
fonction uniquement si vous avez besoin d'un bloc de code. Vous pouvez supprimer le run
-bloc si vous n'avez qu'un oneliner après l'opérateur elvis ( ?:
).
Sachez que le run
bloc sera évalué s'il b
est nul ou si le let
-bloc est évalué à null
.
Pour cette raison, vous ne voulez généralement qu'une if
expression.
val a = if (b == null) {
// ...
} else {
// ...
}
Dans ce cas, le else
-bloc ne sera évalué que s'il b
n'est pas nul.
a
n'est pas accessible à l'intérieurlet
et dans lerun
bloc.a
n'est pas encore défini dans le cadre delet
etrun
. Mais vous pouvez accéder à la valeur deb
inside thelet
avec le paramètre impliciteit
. Cela sert le même objectif, je suppose.a
avant ces blocs de code. Eta
peut être consulté à l'intérieur.a
? Si c'est le casb
, ilit
sert exactement le même objectif. Est-il réaffectéa
avec le résultat duval
-bloc?it
partir dulet
bloc. Le résultat du bloclet
ourun
sera attribué àa
. Le résultat est la dernière expression du bloc. Vous utilisez l'affectation aprèslet
/run
a terminé, comme vous le faites pour toute autre affectation normale.Commençons par nous assurer que nous comprenons la sémantique de l'idiome Swift fourni:
Cela signifie ceci: "si le
<expr>
résultat est un optionnel non nul, entrez lethen
bloc avec le symbolea
lié à la valeur non emballée . Sinon, entrez leelse
bloc.Notez en particulier qu'il
a
n'est lié que dans lethen
bloc- . À Kotlin, vous pouvez facilement l'obtenir en appelantet vous pouvez ajouter un
else
-bloc comme ceci:Il en résulte la même sémantique que l'idiome Swift.
la source
Ma réponse est totalement une copie du chat des autres. Cependant, je ne comprends pas facilement leur expression. Je suppose donc que ce serait bien de fournir une réponse plus compréhensible.
En rapide:
À Kotlin:
la source
let
au lieu dealso
signifie que lerun
bloc s'exécutera à chaquelet
retour du blocnull
, ce qui n'est pas ce que nous voulons.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 n'est pas nulle et le compilateur suit les informations sur la vérification que vous avez effectuée et permet de les utiliser telles quelles.
Dans Swift:
À Kotlin:
Consultez la documentation: (null-safety) pour plus de cas d'utilisation de ce type
la source
if let
déclaration.Swift
Optional Binding
(la soi-disantif-let
instruction) est utilisée pour savoir si un optionnel contient une valeur, et si c'est le cas, pour rendre cette valeur disponible comme constante ou variable temporaire. Donc, unOptional Binding
pour l'if-let
instruction est comme suit:Dans Kotlin, comme dans Swift, pour éviter les plantages provoqués en essayant d'accéder à une valeur nulle alors que ce n'est pas prévu, une syntaxe spécifique (comme
b.let { }
dans le deuxième exemple) est fournie pour un déroulement correctnullable types
:La
let
fonction de Kotlin , lorsqu'elle est utilisée en combinaison avec l'opérateur d'appel sécurisé?:
, fournit un moyen concis de gérer les expressions Nullable.guard let
déclaration.guard-let
La déclaration dans Swift est simple et puissante. Il vérifie certaines conditions et s'il est évalué comme faux, alors l'else
instruction s'exécute, ce qui normalement quittera une méthode.Contrairement à Swift, à Kotlin, il n'y a aucune déclaration de garde . Cependant, vous pouvez utiliser le
Elvis Operator
-?:
pour obtenir un effet similaire.J'espère que cela t'aides.
la source
Voici comment exécuter du code uniquement lorsque
name
n'est pas nul:la source
let
fait, mais la question concerne laelse
stratégie qui s'exécute si l'objet sur lequellet
est appelé estnull
. Swift l'a d'une manière plus naturelle (discutable). Mais après avoir beaucoup fait à la fois Kotlin et Swift, j'aurais aimé que Kotlin ait un simple déballage comme le fait Swift.Voici ma variante, limitée au cas très courant "sinon nul".
Tout d'abord, définissez ceci quelque part:
Cela devrait probablement l'être
internal
, pour éviter les conflits.Maintenant, convertissez ce code Swift:
À ce code Kotlin:
Notez que comme toujours avec les blocs dans Kotlin, vous pouvez supprimer l'argument et utiliser
it
:Mais si le bloc fait plus de 1 à 2 lignes, il est probablement préférable d'être explicite.
C'est aussi similaire à Swift que je pourrais le trouver.
la source
Il existe un moyen similaire dans kotlin pour obtenir le style if-let de Swift
Vous pouvez également attribuer plusieurs valeurs Nullable
Ce type d'approche sera plus approprié si les valeurs Nullable sont utilisées plus d'une fois. À mon avis, cela aide du point de vue des performances car la valeur nullable ne sera vérifiée qu'une seule fois.
source: Discussion de Kotlin
la source
J'ajoute cette réponse pour clarifier la réponse acceptée car elle est trop grande pour un commentaire.
Le modèle général ici est que vous pouvez utiliser n'importe quelle combinaison des fonctions de portée disponibles dans Kotlin séparées par l' opérateur Elvis comme ceci:
Par exemple:
la source
L'option la plus propre à mon avis est la suivante
Rapide:
Kotlin
la source
La réponse courte est d'utiliser un simple IF-ELSE car au moment de ce commentaire, il n'y a pas d'équivalent dans Kotlin LET,
la source