Swift 2 memperkenalkan guard
kata kunci, yang dapat digunakan untuk memastikan bahwa berbagai data dikonfigurasikan siap untuk digunakan. Contoh yang saya lihat di situs web ini menunjukkan fungsi submitTapped:
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
Saya bertanya-tanya apakah menggunakan guard
itu berbeda dari melakukannya dengan cara lama, menggunakan suatu if
kondisi. Apakah itu memberi manfaat, yang tidak bisa Anda dapatkan dengan menggunakan cek sederhana?
swift2
guard-statement
David Snabel
sumber
sumber
Jawaban:
Membaca artikel ini saya perhatikan manfaat besar menggunakan Guard
Di sini Anda dapat membandingkan penggunaan penjaga dengan contoh:
Ini adalah bagian tanpa penjaga:
Di sini Anda meletakkan kode yang Anda inginkan dalam semua kondisi
Anda mungkin tidak langsung melihat masalah dengan ini, tetapi Anda bisa membayangkan betapa membingungkannya jika itu bersarang dengan berbagai kondisi yang semua harus dipenuhi sebelum menjalankan pernyataan Anda
Cara untuk membersihkan ini adalah dengan melakukan masing-masing cek Anda terlebih dahulu, dan keluar jika ada yang tidak dipenuhi. Ini memudahkan pemahaman tentang kondisi apa yang akan membuat fungsi ini keluar.
Tapi sekarang kita bisa menggunakan penjaga dan kita bisa melihat itu mungkin untuk menyelesaikan beberapa masalah:
Pola yang sama juga berlaku untuk nilai-nilai non-opsional:
Jika Anda masih memiliki pertanyaan, Anda dapat membaca seluruh artikel: Pernyataan penjaga cepat.
Membungkus
Dan akhirnya, membaca dan menguji saya menemukan bahwa jika Anda menggunakan penjaga untuk membuka opsi,
.
Di sini nilai yang terbuka akan tersedia hanya di dalam blok if
sumber
let x = x where x > 0
apakah berarti Anda telah digabungkan kondisi lain ke dalam opsional mengikat? Maksud saya sedikit berbeda dariif let constantName = someOptional { statements }
Tidak seperti
if
,guard
menciptakan variabel yang dapat diakses dari luar bloknya. Ini berguna untuk membuka banyakOptional
s.sumber
Sebenarnya ada dua manfaat besar untuk
guard
. Salah satunya adalah menghindari piramida malapetaka, seperti yang telah disebutkan orang lain - banyakif let
pernyataan menjengkelkan bersarang di dalam satu sama lain bergerak semakin jauh ke kanan.Manfaat lainnya adalah logika yang ingin Anda terapkan lebih "
if not let
" daripada "if let { } else
".Berikut ini sebuah contoh: misalkan Anda ingin menerapkan
accumulate
- persilangan di antaramap
dan direduce
mana ia mengembalikan array yang berjalan berkurang. Ini dia denganguard
:Bagaimana Anda menulisnya tanpa penjaga, tetapi masih menggunakan
first
yang mengembalikan opsional? Sesuatu seperti ini:Bersarang ekstra mengganggu, tetapi juga, tidak logis untuk memiliki
if
danelse
begitu jauh. Jauh lebih mudah dibaca untuk memiliki pintu keluar awal untuk kasing kosong, dan kemudian melanjutkan dengan fungsi lainnya seolah-olah itu bukan suatu kemungkinan.sumber
Ketika suatu kondisi terpenuhi menggunakannya
guard
mengekspos variabel yang dideklarasikan di dalamguard
blok ke sisa kode-blok, membawa mereka ke dalam cakupannya. Yang, seperti yang dinyatakan sebelumnya, tentu akan berguna denganif let
pernyataan bersarang .Perhatikan bahwa penjaga memerlukan pengembalian atau lemparan dalam pernyataannya yang lain.
Parsing JSON dengan Guard
Di bawah ini adalah contoh bagaimana seseorang dapat mengurai objek JSON menggunakan penjaga daripada jika-biarkan. Ini adalah kutipan dari entri blog yang menyertakan file taman bermain yang dapat Anda temukan di sini:
Cara menggunakan Guard di Swift 2 untuk mengurai JSON
unduh taman bermain: taman bermain guard
Info lebih lanjut:
Berikut adalah kutipan dari Panduan Bahasa Pemrograman Bahasa Swift:
sumber
Salah satu manfaatnya adalah mengeliminasi banyak
if let
pernyataan yang bersarang . Lihat video WWDC "What's New in Swift" sekitar pukul 15:30, bagian berjudul "Pyramid of Doom".sumber
Kapan harus menggunakan penjaga
Jika Anda memiliki pengontrol tampilan dengan beberapa elemen UITextField atau jenis input pengguna lain, Anda akan segera melihat bahwa Anda harus membuka bungkusan opsional textField.text untuk mendapatkan teks di dalamnya (jika ada!). isEmpty tidak akan membantu Anda di sini, tanpa masukan apa pun, bidang teks hanya akan mengembalikan nol.
Jadi, Anda memiliki beberapa di antaranya yang Anda buka dan akhirnya beralih ke fungsi yang mempostingnya ke titik akhir server. Kami tidak ingin kode server harus berurusan dengan nilai nil atau salah mengirim nilai yang tidak valid ke server sehingga kami akan membuka bungkusan nilai input tersebut dengan penjaga terlebih dahulu.
Anda akan melihat bahwa fungsi komunikasi server kami mengambil nilai-nilai String non-opsional sebagai parameter, oleh karena itu penjaga membuka bungkus sebelumnya. Bongkar membuka sedikit tidak intuitif karena kita terbiasa membuka bungkusan dengan jika membiarkan yang membuka nilai untuk digunakan di dalam blok. Di sini pernyataan penjaga memiliki blok terkait tetapi sebenarnya adalah blok lain - yaitu hal yang Anda lakukan jika pembatalan gagal - nilainya terbuka langsung ke konteks yang sama dengan pernyataan itu sendiri.
// pemisahan masalah
Tanpa penjaga
Tanpa menggunakan penjaga, kita akan berakhir dengan tumpukan kode besar yang menyerupai piramida malapetaka . Ini tidak skala dengan baik untuk menambahkan bidang baru ke formulir kami atau membuat kode yang sangat mudah dibaca. Lekukan bisa sulit untuk diikuti, terutama dengan begitu banyak pernyataan di setiap cabang.
Ya, kami bahkan bisa menggabungkan semua ini jika membiarkan pernyataan menjadi satu pernyataan yang dipisahkan dengan koma tetapi kami akan kehilangan kemampuan untuk mengetahui pernyataan yang gagal dan menyajikan pesan kepada pengguna.
https://thatthinginswift.com/guard-statement-swift/
sumber
Dengan menggunakan penjaga, kehebatan kami jelas. kami tidak ingin menjalankan sisa kode jika kondisi tertentu tidak terpenuhi. di sini kita dapat memperluas rantai juga, silakan lihat kode di bawah ini:
sumber
Pernyataan penjaga akan dilakukan. itu berbeda
1) itu memungkinkan saya untuk mengurangi bersarang jika pernyataan
2) itu meningkatkan ruang lingkup saya yang dapat diakses oleh variabel saya
jika Pernyataan
Pernyataan penjaga
sumber
Pernyataan Penjaga
Pernyataan penjaga digunakan untuk mentransfer kontrol program di luar ruang lingkup jika satu atau lebih kondisi tidak terpenuhi.
Synatx:
Keuntungan:
1. Dengan menggunakan
guard
pernyataan, kita dapat menyingkirkan persyaratan bersarang mendalam yang tujuan satu-satunya adalah memvalidasi seperangkat persyaratan.2. Ini dirancang khusus untuk keluar dari metode atau fungsi lebih awal.
jika Anda gunakan jika biarkan di bawah ini adalah kode tampilannya.
Menggunakan pelindung, Anda dapat mentransfer kontrol di luar ruang lingkup jika satu atau beberapa kondisi tidak terpenuhi.
Referensi:
1. Swift 2: Keluar Dini Dengan penjaga 2. Udacity 3. Pernyataan Penjaga
sumber
if condition { return }
bermuka masam?Seperti pernyataan if, guard mengeksekusi pernyataan berdasarkan nilai ekspresi Boolean. Tidak seperti pernyataan if, pernyataan penjaga hanya berjalan jika kondisinya tidak terpenuhi. Anda bisa menganggap penjagaan lebih seperti Penegasan, tetapi alih-alih menabrak, Anda dapat keluar dengan anggun.
lihat: http://ericcerney.com/swift-guard-statement/
sumber
Itu benar-benar membuat aliran urutan dengan beberapa pencarian dan opsional jauh lebih ringkas dan jelas dan mengurangi banyak jika bersarang. Lihat posting Erica Sadun tentang mengganti Ifs . .... Bisa terbawa, contoh di bawah ini:
Lihat apakah itu menempel.
sumber
Sederhananya, ini menyediakan cara untuk memvalidasi bidang sebelum eksekusi. Ini adalah gaya pemrograman yang baik karena meningkatkan keterbacaan. Dalam bahasa lain, tampilannya mungkin seperti ini:
Tetapi karena Swift memberi Anda opsional, kami tidak dapat memeriksa apakah itu nihil dan menetapkan nilainya ke variabel. Sebaliknya,
if let
periksa bukan nol dan tetapkan variabel untuk menyimpan nilai aktual. Di sinilahguard
berperan. Ini memberi Anda cara yang lebih singkat untuk keluar dari awal menggunakan opsional.sumber
Sumber: Penjaga di Swift
Mari kita lihat contoh untuk memahaminya dengan jelas
Contoh 1:
Dalam contoh di atas kita melihat bahwa 3 lebih besar dari 2 dan pernyataan di dalam klausa guard lainnya dilewati dan True dicetak.
Contoh 2:
Dalam contoh di atas kita melihat bahwa 1 lebih kecil dari 2 dan pernyataan di dalam klausa guard lainnya dieksekusi dan False dicetak diikuti oleh return.
Dalam contoh di atas kita menggunakan pelindung biarkan untuk membuka bungkus opsional. Dalam fungsi getName, kami telah mendefinisikan variabel tipe string myName yang opsional. Kami kemudian menggunakan penjaga biarkan untuk memeriksa apakah variabel myName adalah nil atau tidak, jika tidak menetapkan untuk nama dan memeriksa lagi, nama tidak kosong. Jika kedua kondisi tersebut memenuhi syarat yaitu benar, blok yang lain akan dilewati dan mencetak “Ketentuan dipenuhi nama”.
Pada dasarnya kami memeriksa dua hal di sini yang dipisahkan oleh koma, pertama membuka dan opsional dan memeriksa apakah itu memenuhi syarat atau tidak.
Di sini kita melewatkan apa-apa ke fungsi yaitu string kosong dan karenanya Kondisi salah cetak.
Di sini kita melewati "Halo" ke fungsi dan Anda dapat melihat output dicetak "Kondisi terpenuhi Halo".
sumber