Di Kotlin, apakah ada yang setara dengan kode Swift di bawah ini?
if let a = b.val {
}
else {
}
Anda dapat menggunakan let
-fungsi seperti ini:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Perhatikan bahwa Anda perlu memanggil run
fungsi tersebut hanya jika Anda memerlukan blok kode. Anda dapat menghapus run
-block jika Anda hanya memiliki satu perjalanan setelah elvis-operator ( ?:
).
Ketahuilah bahwa run
blok akan dievaluasi baik jika b
nol, atau jika let
-block bernilai null
.
Karena itu, biasanya Anda hanya menginginkan if
ekspresi.
val a = if (b == null) {
// ...
} else {
// ...
}
Dalam kasus ini, else
-block hanya akan dievaluasi jika b
bukan null.
a
tidak dapat diakses di dalamlet
danrun
diblokir.a
belum ditentukan di dalam ruang lingkuplet
danrun
. Tetapi Anda dapat mengakses nilaib
di dalamlet
dengan parameter implisitit
. Kurasa ini melayani tujuan yang sama.a
sebelum blok kode tersebut. Dana
bisa diakses di dalam.a
? Jika yab
, makait
melayani tujuan yang sama persis. Apakah itu menetapkan ulanga
dengan hasilval
-block?it
dari dalamlet
blok. Hasil dari bloklet
ataurun
akan ditetapkan kea
. Hasilnya adalah ekspresi terakhir di blok tersebut. Anda menggunakan tugas setelahlet
/run
selesai, seperti yang Anda lakukan dengan tugas normal lainnya.Pertama-tama, pastikan kita memahami semantik dari idiom Swift yang disediakan:
Artinya ini: "jika
<expr>
hasilnya adalah opsional non-nil, masukkanthen
-block dengan simbola
terikat ke nilai yang tidak dibungkus. Jika tidak, masukkanelse
blok.Terutama perhatikan bahwa hanya
a
terikat di dalamthen
-block . Di Kotlin, Anda bisa dengan mudah mendapatkan ini dengan menelepondan Anda dapat menambahkan
else
-block seperti ini:Ini menghasilkan semantik yang sama dengan idiom Swift.
sumber
Jawaban saya benar-benar merupakan tiruan kucing dari yang lain. Namun, saya tidak dapat memahami ekspresi mereka dengan mudah. Jadi saya rasa alangkah baiknya memberikan jawaban yang lebih bisa dimengerti.
Dengan cepat:
Di Kotlin:
sumber
let
bukannyaalso
berartirun
blok akan dieksekusi setiap kalilet
blok kembalinull
, yang bukan itu yang kita inginkan.Tidak seperti Swift, Tidak perlu membuka bungkus opsional sebelum menggunakannya di Kotlin. Kita bisa saja memeriksa apakah nilainya bukan null dan kompilator melacak informasi tentang pemeriksaan yang Anda lakukan dan mengizinkan untuk menggunakannya sebagai tidak terbungkus.
Di Swift:
Di Kotlin:
Lihat Dokumentasi: (null-safety) untuk lebih banyak kasus penggunaan seperti itu
sumber
if let
pernyataan.Swift
Optional Binding
(yang disebutif-let
pernyataan) digunakan untuk mencari tahu apakah sebuah opsional berisi nilai, dan jika demikian, untuk membuat nilai itu tersedia sebagai konstanta atau variabel sementara. Jadi,Optional Binding
untukif-let
pernyataannya adalah sebagai berikut:Di Kotlin, seperti di Swift, untuk menghindari error yang disebabkan oleh mencoba mengakses nilai null yang tidak diharapkan, sintaks khusus (seperti
b.let { }
di contoh kedua) disediakan untuk membuka bungkusan dengan benarnullable types
:let
Fungsi Kotlin , jika digunakan bersama dengan operator safe-call?:
, menyediakan cara yang ringkas untuk menangani ekspresi nullable.guard let
pernyataan.guard-let
pernyataan di Swift sederhana dan kuat. Ia memeriksa beberapa kondisi dan jika dinilai salah, makaelse
pernyataan dieksekusi yang biasanya akan keluar dari metode.Tidak seperti Swift, di Kotlin, tidak ada pernyataan penjaga sama sekali. Namun, Anda dapat menggunakan
Elvis Operator
-?:
untuk mendapatkan efek yang serupa.Semoga ini membantu.
sumber
Berikut cara hanya mengeksekusi kode saat
name
bukan null:sumber
let
, tetapi pertanyaannya adalah tentangelse
strategi yang dijalankan jika objek yanglet
dipanggil adalahnull
. Swift melakukannya dengan cara yang lebih alami (bisa diperdebatkan). Tetapi setelah melakukan banyak hal baik Kotlin dan Swift, saya berharap Kotlin membuka bungkusan sederhana seperti yang dilakukan Swift.Inilah varian saya, terbatas pada kasus "jika tidak null" yang sangat umum.
Pertama-tama, tentukan ini di suatu tempat:
Mungkin seharusnya begitu
internal
, untuk menghindari konflik.Sekarang, ubah kode Swift ini:
Untuk kode Kotlin ini:
Perhatikan bahwa seperti biasa dengan blok di Kotlin, Anda dapat melepaskan argumen dan menggunakan
it
:Tetapi jika pemblokirannya lebih dari 1-2 baris, sebaiknya eksplisitkan.
Ini mirip dengan Swift yang bisa saya temukan.
sumber
Ada cara serupa di kotlin untuk mencapai gaya if-let Swift
Anda juga dapat menetapkan beberapa nilai nullable
Pendekatan semacam ini akan lebih cocok jika nilai nullable digunakan lebih dari 1 kali. Menurut saya, ada baiknya dari aspek kinerja karena nilai nullable hanya akan diperiksa satu kali.
sumber: Diskusi Kotlin
sumber
Saya menambahkan jawaban ini untuk memperjelas jawaban yang diterima karena terlalu besar untuk komentar.
Pola umum di sini adalah Anda dapat menggunakan kombinasi Scope Functions yang tersedia di Kotlin yang dipisahkan oleh Operator Elvis seperti ini:
Sebagai contoh:
sumber
Pilihan terbersih menurut saya adalah ini
Cepat:
Kotlin
sumber
Jawaban singkatnya adalah gunakan sederhana IF-ELSE karena pada saat komentar ini tidak ada padanannya di Kotlin LET,
sumber