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.
func icon() -> UIImage {
guard let image = UIImage(named: "Photo") else {
return UIImage(named: "Default")! //This is your fallback
}
return image //-----------------you're always expecting/hoping this to happen
}
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!
Hindari guard
ketika mereka menciptakan efek samping, pelindung digunakan sebagai aliran alami . Hindari penjaga ketika else
klausul memperkenalkan efek samping. Penjaga menetapkan kondisi yang diperlukan agar kode dapat dijalankan dengan benar, menawarkan keluar lebih awal
Saat Anda melakukan komputasi signifikan di cabang positif, lakukan refaktorisasi dari if
ke guard
pernyataan dan kembalikan nilai fallback di else
klausa
Dari: Buku Swift Style Erica Sadun
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.
guard let image = UIImage(named: selectedImageName) else { // YESSSSSS
assertionFailure("Missing \(selectedImageName) asset")
return
}
guard let image = UIImage(named: selectedImageName) else { // NOOOOOOO
return
}
Dari: Buku Swift Style Erica Sadun + beberapa modifikasi
(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
dan if let
buka variabelnya
Dengan guard let
Anda membuat variabel baru yang akan ada di luar else
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:
func someFunc(blog: String?) {
guard let blogName = blog else {
print("some ErrorMessage")
print(blogName) // will create an error Because blogName isn't defined yet
return
}
print(blogName) // You can access it here ie AFTER the guard statement!!
//And if I decided to do 'another' guard let with the same name ie 'blogName' then I would create an error!
guard let blogName = blog else { // errorLine: Definition Conflicts with previous value.
print(" Some errorMessage")
return
}
print(blogName)
}
if-let:
func someFunc(blog: String?) {
if let blogName1 = blog {
print(blogName1) // You can only access it inside the code block. Outside code block it doesn't exist!
}
if let blogName1 = blog { // No Error at this line! Because blogName only exists inside the code block ie {}
print(blogName1)
}
}
Untuk info lebih lanjut tentang, if let
lihat: Mengapa deklarasi ulang pengikatan opsional tidak membuat kesalahan
Penjaga 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:
var str : String?
guard let blogName1 = str else {
print("some error")
return // Error: Return invalid outside of a func
}
print (blogName1)
Karena if let
Anda tidak perlu memilikinya di dalam fungsi apa pun:
var str : String?
if let blogName1 = str {
print(blogName1) // You don't get any errors!
}
guard
vs. if
Itu perlu dicatat bahwa itu lebih tepat untuk melihat pertanyaan ini sebagai guard let
vs if let
dan guard
vs if
.
Standalone if
tidak membuka bungkusnya, begitu pula standalone guard
. Lihat contoh di bawah ini. Itu tidak keluar lebih awal jika nilainya nil
. Tidak ada nilai opsional. Itu hanya keluar lebih awal jika suatu kondisi tidak terpenuhi.
let array = ["a", "b", "c"]
func subscript(at index: Int) -> String?{
guard index > 0, index < array.count else { return nil} // exit early with bad index
return array[index]
}
if let
jikanon-nil
kasusnya valid. Gunakanguard
jikanil
case menunjukkan semacam kesalahan.