Czy w Kotlinie jest odpowiednik kodu Swift poniżej?
if let a = b.val {
}
else {
}
Możesz użyć let
tej funkcji w następujący sposób:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Pamiętaj, że musisz wywołać tę run
funkcję tylko wtedy, gdy potrzebujesz bloku kodu. Możesz usunąć run
-block, jeśli masz tylko oneliner po elvis-operator ( ?:
).
Należy pamiętać, że run
blok zostanie oceniony, jeśli b
ma wartość null lub jeśli wartość let
-block wynosi null
.
Z tego powodu zwykle potrzebujesz tylko if
wyrażenia.
val a = if (b == null) {
// ...
} else {
// ...
}
W takim przypadku else
-block zostanie oszacowany tylko wtedy, gdy b
nie jest null.
a
nie można uzyskać dostępu do środkalet
irun
zablokować.a
nie jest jeszcze zdefiniowana w zakresielet
irun
. Ale możesz uzyskać dostęp do wartościb
wewnątrz zalet
pomocą niejawnego parametruit
. To chyba służy temu samemu celowi.a
przed tymi blokami kodu. Ia
można dostać się do środka.a
? Jeśli takb
, toit
służy dokładnie temu samemu celowi. Czy ponownie przypisujea
z wynikiemval
-block?it
zlet
bloku. Wynik blokulet
lubrun
zostanie przypisany doa
. Wynikiem jest ostatnie wyrażenie w bloku. Używasz zadania po zakończeniulet
/ porun
zakończeniu, tak jak w przypadku każdego innego normalnego zadania.Najpierw upewnijmy się, że rozumiemy semantykę podanego idiomu Swift:
Oznacza to: „jeśli
<expr>
wynik ma wartośćthen
różną od zera, wprowadź -block z symbolema
powiązanym z nieopakowaną wartością. W przeciwnym razie wprowadźelse
blok.Zwróć szczególną uwagę, że
a
jest to związane tylko dothen
-bloku . W Kotlinie możesz to łatwo uzyskać dzwoniąci możesz dodać plik
else
-block w ten sposób:Powoduje to taką samą semantykę, jak w idiomie Swift.
źródło
Moja odpowiedź jest całkowicie kopiowana przez innych. Jednak nie mogę łatwo zrozumieć ich wypowiedzi. Więc myślę, że byłoby miło udzielić bardziej zrozumiałej odpowiedzi.
Szybko:
W Kotlinie:
źródło
let
zamiastalso
oznacza, żerun
blok zostanie wykonany za każdym razem, gdylet
blok zwrócinull
, co nie jest tym, czego chcemy.W przeciwieństwie do Swifta, nie trzeba rozpakowywać opcjonalnego przed użyciem go w Kotlinie. Moglibyśmy po prostu sprawdzić, czy wartość jest różna od null, a kompilator śledzi informacje o wykonanym sprawdzeniu i zezwala na użycie go jako rozpakowanego.
W Swift:
W Kotlinie:
Więcej takich przypadków użycia można znaleźć w dokumentacji: (null-safety)
źródło
if let
komunikat.Swift's
Optional Binding
(tak zwanaif-let
instrukcja) służy do sprawdzenia, czy opcja opcjonalna zawiera wartość, a jeśli tak, do udostępnienia tej wartości jako tymczasowej stałej lub zmiennej. Tak więc instrukcjaOptional Binding
dlaif-let
instrukcji wygląda następująco:W Kotlinie, podobnie jak w Swift, aby uniknąć awarii spowodowanych próbą uzyskania dostępu do wartości null, gdy nie jest to oczekiwane, przewidziana jest specyficzna składnia (jak
b.let { }
w drugim przykładzie) do prawidłowego rozpakowanianullable types
:let
Funkcja Kotlina , gdy jest używana w połączeniu z operatorem bezpiecznego wywołania?:
, zapewnia zwięzły sposób obsługi wyrażeń dopuszczających wartość null.guard let
komunikat.guard-let
Oświadczenie w Swift jest proste i potężne. Sprawdza, czy występuje warunek i jeśli zostanie oszacowany jako fałszywy,else
wykonywana jest instrukcja, która normalnie kończy działanie metody.W przeciwieństwie do Swifta, w Kotlinie nie ma żadnego oświadczenia strażnika . Możesz jednak użyć
Elvis Operator
-,?:
aby uzyskać podobny efekt.Mam nadzieję że to pomoże.
źródło
Oto jak wykonać kod tylko wtedy, gdy
name
nie jest null:źródło
let
robi, ale pytanie dotyczyelse
strategii, która jest wykonywana, jeśli obiekt, na którymlet
jest wywoływany, jestnull
. Swift ma to w bardziej naturalny (dyskusyjny) sposób. Ale zrobiwszy dużo zarówno Kotlin, jak i Swift, chciałbym, aby Kotlin miał proste rozpakowanie, jak robi to Swift.Oto mój wariant, ograniczony do bardzo powszechnego przypadku „jeśli nie zerowy”.
Przede wszystkim zdefiniuj to gdzieś:
Prawdopodobnie powinno
internal
, aby uniknąć konfliktów.Teraz przekonwertuj ten kod Swift:
Do tego kodu Kotlin:
Zauważ, że jak zawsze w przypadku bloków w Kotlinie, możesz porzucić argument i użyć
it
:Ale jeśli blok ma więcej niż 1-2 wiersze, prawdopodobnie najlepiej jest to wyraźnie określić.
To jest tak podobne do Swift, jak mogłem znaleźć.
źródło
W kotlinie istnieje podobny sposób osiągnięcia stylu Swifta, jeśli - pozwolę
Można również przypisać wiele wartości dopuszczających wartość null
Takie podejście będzie bardziej odpowiednie, jeśli wartości dopuszczające wartość null są używane więcej niż 1 razy. Moim zdaniem pomaga to z punktu widzenia wydajności, ponieważ wartość zerowa zostanie sprawdzona tylko raz.
źródło: Dyskusja Kotlin
źródło
Dodaję tę odpowiedź, aby wyjaśnić zaakceptowaną odpowiedź, ponieważ jest za duża na komentarz.
Ogólny wzorzec jest taki, że możesz użyć dowolnej kombinacji funkcji zakresu dostępnych w Kotlin oddzielonych operatorem Elvisa w następujący sposób:
Na przykład:
źródło
Moim zdaniem najczystsza opcja jest taka
Szybki:
Kotlin
źródło
Krótka odpowiedź brzmi: użyj prostego IF-ELSE, ponieważ do czasu tego komentarza nie ma odpowiednika w Kotlin LET,
źródło