Membaca artikel ini saya perhatikan manfaat besar menggunakan Guard
Di sini Anda dapat membandingkan penggunaan penjaga dengan contoh:
Ini adalah bagian tanpa penjaga:
func fooBinding(x: Int?) {
if let x = x where x > 0 {
// Do stuff with x
x.description
}
// Value requirements not met, do something
}
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:
func fooGuard(x: Int?) {
guard let x = x where x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
x.description
}
- Memeriksa kondisi yang Anda inginkan, bukan kondisi yang tidak Anda inginkan. Ini lagi mirip dengan pernyataan. Jika kondisi tidak terpenuhi, pernyataan penjaga lain dijalankan, yang keluar dari fungsi.
- Jika kondisi berlalu, variabel opsional di sini secara otomatis terbuka untuk Anda dalam lingkup yang disebut pernyataan penjaga - dalam hal ini, fungsi fooGuard (_ :).
- Anda memeriksa kasus-kasus buruk lebih awal, membuat fungsi Anda lebih mudah dibaca dan lebih mudah dirawat
Pola yang sama juga berlaku untuk nilai-nilai non-opsional:
func fooNonOptionalGood(x: Int) {
guard x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
}
func fooNonOptionalBad(x: Int) {
if x <= 0 {
// Value requirements not met, do something
return
}
// Do stuff with x
}
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,
nilai-nilai yang terbuka itu tetap ada untuk Anda gunakan di sisa blok kode Anda
.
guard let unwrappedName = userName else {
return
}
print("Your username is \(unwrappedName)")
Di sini nilai yang terbuka akan tersedia hanya di dalam blok if
if let unwrappedName = userName {
print("Your username is \(unwrappedName)")
} else {
return
}
// this won't work – unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")