Guard netliği artırabilir
Muhafız kullandığınızda , korumanın başarılı olması için çok daha yüksek bir beklentiniz vardır ve eğer başarılı olmazsa, o zaman sadece kapsamdan erken çıkmak istemeniz biraz önemlidir . Bir dosya / görüntünün var olup olmadığını, bir dizi Boş olup olmadığını görmek için koruduğunuz gibi.
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
}
Yukarıdaki kodu if-let ile yazarsanız, okuma geliştiricisine 50-50'den daha fazlası olduğunu iletir. Ama eğer koruma kullanırsanız, kodunuza netlik katarsınız ve bu, bunun% 95 oranında çalışmasını bekliyorum anlamına gelir ... Eğer başarısız olursa, neden olacağını bilmiyorum; pek olası değil ... ama sonra bunun yerine sadece bu varsayılan resmi kullanın ya da belki sadece neyin yanlış gittiğini açıklayan anlamlı bir mesajla iddia edin!
guardYan etkiler yarattıklarında kaçının , korumalar doğal akış olarak kullanılmalıdır . elseMaddeler yan etkilere neden olduğunda korumalardan kaçının . Muhafızlar , kodun düzgün çalışması için gerekli koşulları belirler ve erken çıkış sunar
Pozitif dalda önemli hesaplamalar gerçekleştirdiğinizde, ' ifdan bir guardifadeye yeniden düzenleme yapın ve elseyan tümcede geri dönüş değerini döndürür
Gönderen: Erica Sadun'un Swift Style kitabı
Ayrıca yukarıdaki önerilerin ve temiz kodun bir sonucu olarak, başarısız koruma ifadelerine iddialar eklemek isteyip istemediğinizi / buna ihtiyaç duymanız daha olasıdır , bu sadece okunabilirliği artırır ve diğer geliştiricilere ne beklediğinizi netleştirir.
guard let image = UIImage(named: selectedImageName) else { // YESSSSSS
assertionFailure("Missing \(selectedImageName) asset")
return
}
guard let image = UIImage(named: selectedImageName) else { // NOOOOOOO
return
}
Gönderen: Erica Sadun'un Swift Style kitabı + bazı değişiklikler
( if-letURL'ler için iddiaları / ön koşulları kullanmayacaksınız . Bu doğru görünmüyor)
Muhafız kullanmak ayrıca kıyamet piramidinden kaçınarak netliği artırmanıza yardımcı olur . Nitin'in cevabına bakın .
Guard yeni bir değişken oluşturur
Kimsenin iyi açıklamadığına inandığım önemli bir fark var.
Hem guard letve if let unwrap değişken ancak
İle guard letsen oluştururken olacak yeni bir değişken var dışarıda elseaçıklamada.
İle if letsen yaratmak değildir herhangi bir yeni değişken sonra başka açıklamada, yalnızca girmek kod bloğu ise opsiyonel olmayan sıfırdır. Yeni oluşturulan değişken yalnızca kod bloğunun içinde var olur !
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)
}
}
Daha fazla bilgi için if letbkz: İsteğe bağlı bağlamanın yeniden bildirilmesi neden bir hata oluşturmaz
Koruma, kapsamdan çıkılmasını gerektirir
(Rob Napier'in cevabında da bahsedilmiştir):
Bir işlev içindeguard tanımlamış olmanız GEREKİR . Bu önemli amacı, / iade / çıkış kapsamını iptal etmektir var ise bir koşul yerine getirilmediği:
var str : String?
guard let blogName1 = str else {
print("some error")
return // Error: Return invalid outside of a func
}
print (blogName1)
İçin if letherhangi bir fonksiyon içine olması gerekmez:
var str : String?
if let blogName1 = str {
print(blogName1) // You don't get any errors!
}
guard vs if
Bu soruyu guard letvs if letve guardvs olarak görmenin daha uygun olduğunu belirtmek gerekir if.
Tek başına ifbir paket açma işlemi yapmaz, tek başına da yapmaz guard. Aşağıdaki örneğe bakın. Bir değer ise erken çıkmaz nil. İsteğe bağlı değer YOKTUR. Bir koşul karşılanmazsa erken çıkar.
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 letolduğunda kullanınnon-nil. Durum bir tür hatayı temsilguardettiğinde kullanınnil.