Gibt es in Kotlin ein Äquivalent zum Swift-Code unten?
if let a = b.val {
}
else {
}
Sie können die let
-funktion folgendermaßen verwenden:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Beachten Sie, dass Sie die run
Funktion nur aufrufen müssen, wenn Sie einen Codeblock benötigen. Sie können den run
-block entfernen, wenn Sie nur nach dem elvis-operator ( ?:
) einen Oneliner haben .
Beachten Sie, dass der run
Block entweder ausgewertet wird, wenn er b
null ist, oder wenn der let
-block ausgewertet wird null
.
Aus diesem Grund möchten Sie normalerweise nur einen if
Ausdruck.
val a = if (b == null) {
// ...
} else {
// ...
}
In diesem Fall wird der else
-block nur ausgewertet, wenn er b
nicht null ist.
a
kann nicht innerhalblet
undrun
Block zugegriffen werden .a
ist noch nicht im Rahmen vonlet
und definiertrun
. Sie können jedoch mit dem impliziten Parameter auf den Wert vonb
inside zugreifen . Dies dient dem gleichen Zweck, den ich denke.let
it
a
vor diesen Codeblöcken. Unda
kann innen zugegriffen werden.a
? Wenn jab
, dannit
dient genau der gleiche Zweck. Wird esa
mit dem Ergebnis desval
Blocks neu zugewiesen ?it
innerhalb deslet
Blocks zugreifen . Das Ergebnis des Blockslet
oderrun
wird zugewiesena
. Das Ergebnis ist der letzte Ausdruck im Block. Sie verwenden die Aufgabe nachlet
/run
beendet, genau wie bei jeder anderen normalen Aufgabe.Stellen wir zunächst sicher, dass wir die Semantik der bereitgestellten Swift-Sprache verstehen:
Dies bedeutet Folgendes: "Wenn die
<expr>
Ergebnisse nicht optional sind, geben Sie denthen
Block mit dem Symbol eina
, das an den nicht umschlossenen Wert gebunden ist. Andernfalls geben Sie denelse
Block ein.Beachten Sie insbesondere, dass nur innerhalb des -blocks
a
gebunden ist . In Kotlin können Sie dies ganz einfach telefonisch erreichenthen
und Sie können einen
else
Block wie folgt hinzufügen :Dies führt zu derselben Semantik wie das Swift-Idiom.
quelle
Meine Antwort ist total eine Nachahmerkatze von den anderen. Ich kann ihren Ausdruck jedoch nicht leicht verstehen. Ich denke, es wäre schön, eine verständlichere Antwort zu geben.
In Kürze:
In Kotlin:
quelle
let
anstelle vonalso
bedeutet, dass derrun
Block immer dann ausgeführt wird, wenn derlet
Block zurückkehrtnull
, was nicht das ist, was wir wollen.Im Gegensatz zu Swift ist es nicht erforderlich, das Optionale zu entpacken, bevor Sie es in Kotlin verwenden. Wir könnten einfach prüfen, ob der Wert nicht null ist, und der Compiler verfolgt die Informationen über die von Ihnen durchgeführte Prüfung und erlaubt, sie als entpackt zu verwenden.
In Swift:
In Kotlin:
Weitere derartige Anwendungsfälle finden Sie in der Dokumentation: (Null-Sicherheit)
quelle
if let
Aussage.Swift's
Optional Binding
(sogenannteif-let
Anweisung) wird verwendet, um herauszufinden, ob ein optionales Element einen Wert enthält, und wenn ja, um diesen Wert als temporäre Konstante oder Variable verfügbar zu machen. EinOptional Binding
für dieif-let
Aussage lautet also wie folgt:In Kotlin wird wie in Swift eine bestimmte Syntax (wie
b.let { }
im zweiten Beispiel) bereitgestellt , um Abstürze zu vermeiden, die durch den Versuch verursacht werden, auf einen Nullwert zuzugreifen, wenn dies nicht erwartet wirdnullable types
:Die Kotlin-
let
Funktion bietet in Kombination mit dem Safe-Call-Operator?:
eine übersichtliche Möglichkeit, nullbare Ausdrücke zu verarbeiten.guard let
Aussage.guard-let
Aussage in Swift ist einfach und mächtig. Es prüft auf eine Bedingung und wenn es als falsch ausgewertet wird, wird dieelse
Anweisung ausgeführt, die normalerweise eine Methode beendet.Im Gegensatz zu Swift gibt es in Kotlin überhaupt keine Wachaussage . Sie können jedoch das
Elvis Operator
- verwenden?:
, um einen ähnlichen Effekt zu erzielen.Hoffe das hilft.
quelle
So führen Sie Code nur aus, wenn er
name
nicht null ist:quelle
let
tut, aber die Frage betrifft dieelse
Strategie, die ausgeführt wird, wenn das Objekt, auf demlet
aufgerufen wird, istnull
. Swift hat es auf natürlichere (fragwürdige) Weise. Aber nachdem ich sowohl Kotlin als auch Swift viel getan habe, wünschte ich mir, Kotlin hätte ein einfaches Auspacken wie Swift.Hier ist meine Variante, die auf den sehr häufigen Fall "wenn nicht null" beschränkt ist.
Definieren Sie dies zunächst irgendwo:
Es sollte wahrscheinlich sein
internal
, um Konflikte zu vermeiden.Konvertieren Sie nun diesen Swift-Code:
Zu diesem Kotlin-Code:
Beachten Sie, dass Sie wie immer bei Blöcken in Kotlin das Argument löschen und Folgendes verwenden können
it
:Wenn der Block jedoch mehr als 1-2 Zeilen umfasst, ist es wahrscheinlich am besten, explizit zu sein.
Dies ist Swift so ähnlich, wie ich es finden konnte.
quelle
In Kotlin gibt es einen ähnlichen Weg, um Swifts Stil zu erreichen
Sie können auch mehrere nullbare Werte zuweisen
Diese Art von Ansatz ist besser geeignet, wenn die nullbaren Werte mehr als einmal verwendet werden. Meiner Meinung nach hilft dies unter Leistungsaspekten, da der nullbare Wert nur einmal überprüft wird.
Quelle: Kotlin Diskussion
quelle
Ich füge diese Antwort hinzu, um die akzeptierte Antwort zu verdeutlichen, da sie für einen Kommentar zu groß ist.
Das allgemeine Muster ist , dass Sie eine beliebige Kombination der Verwendung können Scope Funktionen in Kotlin von dem abgetrennten Elvis Operator wie folgt aus :
Beispielsweise:
quelle
Die sauberste Option ist meiner Meinung nach dies
Schnell:
Kotlin
quelle
Die kurze Antwort lautet: Verwenden Sie einfach IF-ELSE, da es zum Zeitpunkt dieses Kommentars kein Äquivalent in Kotlin LET gibt.
quelle