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!
guard
Yan etkiler yarattıklarında kaçının , korumalar doğal akış olarak kullanılmalıdır . else
Maddeler 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, ' if
dan bir guard
ifadeye yeniden düzenleme yapın ve else
yan 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-let
URL'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 let
ve if let
unwrap değişken ancak
İle guard let
sen oluştururken olacak yeni bir değişken var dışarıda else
açıklamada.
İle if let
sen 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 let
bkz: İ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 let
herhangi 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 let
vs if let
ve guard
vs olarak görmenin daha uygun olduğunu belirtmek gerekir if
.
Tek başına if
bir 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 let
olduğunda kullanınnon-nil
. Durum bir tür hatayı temsilguard
ettiğinde kullanınnil
.