Saya telah membaca tentang Opsional di Swift, dan saya telah melihat contoh di mana if let
digunakan untuk memeriksa apakah Opsional memiliki nilai, dan jika memang demikian - lakukan sesuatu dengan nilai yang tidak terbungkus.
Namun, saya telah melihat bahwa di Swift 2.0 kata kunci guard let
paling banyak digunakan. Saya bertanya-tanya apakah if let
telah dihapus dari Swift 2.0 atau apakah masih memungkinkan untuk digunakan.
Haruskah saya mengubah program saya yang berisi if let
menjadi guard let
?
sumber
if let
jikanon-nil
kasusnya valid. Gunakanguard
jikanil
case menunjukkan semacam kesalahan.guard
sesuai bahkan jika tidak ada kesalahan. Terkadang itu berarti tidak ada yang bisa dilakukan. Misalnya,positionTitle
metode mungkinguard if let title = title else {return}
. Judul mungkin opsional, dalam hal ini ini bukan kesalahan. Tapiguard let
masih sesuai.if let
hanya terlihat di dalamif let
ruang lingkup. Variabel terikat olehguard let
terlihat sesudahnya. Jadi masuk akal untuk menggunakan pelindung untuk mengikat nilai opsional juga.Penjaga dapat meningkatkan kejelasan
Ketika Anda menggunakan penjaga, Anda memiliki harapan yang jauh lebih tinggi untuk penjaga untuk berhasil dan agak penting jika tidak berhasil, maka Anda hanya ingin keluar dari ruang lingkup lebih awal . Seperti Anda menjaga untuk melihat apakah file / gambar ada, apakah array isEmpty atau tidak.
Jika Anda menulis kode di atas dengan if-let itu menyampaikan kepada pengembang membaca bahwa itu lebih dari 50-50. Tetapi jika Anda menggunakan pelindung, Anda menambahkan kejelasan pada kode Anda dan itu menyiratkan bahwa saya mengharapkan ini bekerja 95% dari waktu ... jika pernah gagal, saya tidak tahu mengapa itu terjadi; itu sangat tidak mungkin ... tapi kemudian gunakan saja gambar default ini sebagai gantinya atau mungkin hanya menegaskan dengan pesan bermakna yang menjelaskan apa yang salah!
Juga sebagai hasil dari saran di atas dan kode bersih, kemungkinan besar Anda ingin / perlu menambahkan pernyataan ke dalam pernyataan penjaga yang gagal , ini hanya meningkatkan keterbacaan dan menjelaskan kepada pengembang lain apa yang Anda harapkan.
(Anda tidak akan menggunakan asserts / preconditions untuk
if-let
s. Sepertinya tidak benar)Menggunakan penjaga juga membantu Anda meningkatkan kejelasan dengan menghindari piramida malapetaka. Lihat jawaban Nitin .
Penjaga membuat variabel baru
Ada satu perbedaan penting yang saya yakin belum ada yang bisa menjelaskan dengan baik.
Keduanya
guard let
danif let
buka variabelnyaDengan
guard let
Anda membuat variabel baru yang akan ada di luarelse
pernyataan.Dengan
if let
Anda tidak membuat variabel baru — setelah pernyataan else, Anda hanya memasukkan blok kode jika opsionalnya bukan nil. Variabel yang baru dibuat hanya ada di dalam blok kode bukan setelahnya!guard let:
if-let:
Untuk info lebih lanjut tentang,
if let
lihat: Mengapa deklarasi ulang pengikatan opsional tidak membuat kesalahanPenjaga membutuhkan ruang lingkup keluar
(Juga disebutkan dalam jawaban Rob Napier):
Anda HARUS telah
guard
mendefinisikan di dalam sebuah func. Tujuan utamanya adalah untuk membatalkan / mengembalikan / keluar dari lingkup, jika kondisi tidak terpenuhi:Karena
if let
Anda tidak perlu memilikinya di dalam fungsi apa pun:guard
vs.if
Itu perlu dicatat bahwa itu lebih tepat untuk melihat pertanyaan ini sebagai
guard let
vsif let
danguard
vsif
.Standalone
if
tidak membuka bungkusnya, begitu pula standaloneguard
. Lihat contoh di bawah ini. Itu tidak keluar lebih awal jika nilainyanil
. Tidak ada nilai opsional. Itu hanya keluar lebih awal jika suatu kondisi tidak terpenuhi.sumber
Kapan menggunakan
if-let
dan kapan menggunakanguard
sering kali menjadi pertanyaan tentang gaya.Katakanlah Anda memiliki
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
dan array item opsional (var optionalArray: [SomeType]?
), dan Anda perlu mengembalikan0
jika array adalahnil
(not-set) ataucount
jika array memiliki nilai (disetel).Anda bisa menerapkannya seperti ini menggunakan
if-let
:atau seperti ini menggunakan
guard
:Contoh-contohnya identik secara fungsional.
Yang
guard
benar-benar bersinar adalah ketika Anda memiliki tugas seperti memvalidasi data, dan Anda ingin fungsi gagal lebih awal jika ada yang salah.Alih-alih menumpuk sekumpulan
if-let
s saat Anda mendekati penyelesaian validasi, "jalur sukses" dan opsional yang sekarang berhasil terikat semuanya ada dalam cakupan utama metode, karena jalur kegagalan telah kembali semuanya.sumber
Saya akan mencoba menjelaskan kegunaan pernyataan penjaga dengan beberapa kode (tidak dioptimalkan).
Anda memiliki UI tempat Anda memvalidasi bidang teks untuk pendaftaran pengguna dengan nama depan, nama belakang, email, telepon, dan kata sandi.
Jika ada bidang teks yang tidak berisi teks yang valid, bidang itu harus menjadi firstResponder.
berikut adalah kode yang tidak dioptimalkan:
Anda dapat melihat di atas, bahwa semua string (firstNameString, lastNameString, dll) hanya dapat diakses dalam cakupan pernyataan if. sehingga menciptakan "piramida malapetaka" ini dan memiliki banyak masalah dengannya, termasuk keterbacaan dan kemudahan memindahkan berbagai hal (jika urutan bidang diubah, Anda harus menulis ulang sebagian besar kode ini)
Dengan pernyataan penjaga (dalam kode di bawah), Anda dapat melihat bahwa string ini tersedia di luar
{}
dan digunakan, jika semua bidang valid.Jika urutan bidang berubah, cukup pindahkan baris kode masing-masing ke atas atau ke bawah, dan Anda siap melakukannya.
Ini adalah penjelasan yang sangat sederhana dan kasus penggunaan. Semoga ini membantu!
sumber
Perbedaan Dasar
Penjaga biarkan
jika membiarkan
CATATAN: Keduanya digunakan untuk membuka bungkus variabel Opsional.
sumber
Penjelasan paling jelas yang saya lihat ada di Github Swift Style Guide :
if
menambahkan tingkat kedalaman:guard
tidak:sumber
menjaga
Pernyataan penjaga memiliki bentuk berikut:
jika membiarkan
sumber
Saya belajar ini dari cepat dengan Bob ..
Khas Else-If
Masalah dengan Else-If
Pernyataan Penjaga Blok penjaga hanya berjalan jika kondisinya salah, dan akan keluar dari fungsi melalui pengembalian. Jika kondisinya benar, Swift mengabaikan blok penjaga. Ini memberikan jalan keluar awal dan tanda kurung yang lebih sedikit. +
Unwrap Opsional dengan Else-If
Pernyataan penjaga tidak hanya berguna untuk mengganti blok bersyarat tipikal dengan pernyataan else-if, tetapi juga bagus untuk membuka bungkusan opsional dengan meminimalkan jumlah tanda kurung. Untuk membandingkan, pertama-tama mari kita mulai cara membuka bungkus beberapa pilihan dengan else-if. Pertama, mari kita buat tiga pilihan yang akan dibuka bungkusnya.
Mimpi Buruk Terburuk
Kode di atas pasti berfungsi tetapi melanggar prinsip KERING. Ini mengerikan. Mari kita hancurkan. +
Sedikit Lebih Baik Kode di bawah ini lebih mudah dibaca daripada di atas. +
Unwrap dengan Guard Pernyataan else-if bisa diganti dengan guard. +
Unwrap Beberapa Opsional dengan Else-If Sejauh ini, Anda telah membuka bungkus pilihan satu per satu. Swift memungkinkan kita membuka beberapa pilihan sekaligus. Jika salah satunya berisi nil, blok else akan dieksekusi.
Unwrap Beberapa Pilihan dengan Guard Tentu saja, kita harus menggunakan pelindung di atas else-if. +
sumber