Diğer faydalı ancak daha ayrıntılı merkezli cevaplara eklemek için bazı büyük resim perspektifi:
Swift'te, ünlem işareti birkaç bağlamda görünür:
- Zorla açma:
let name = nameLabel!.text
- Örtük olarak paketlenmemiş opsiyonel öğeler:
var logo: UIImageView!
- Zorla döküm:
logo.image = thing as! UIImage
- İşlenmeyen istisnalar:
try! NSJSONSerialization.JSONObjectWithData(data, [])
Bunların her biri farklı bir anlama sahip farklı bir dil yapısıdır, ancak hepsinin ortak üç önemli yanı vardır:
1. Ünlem noktaları Swift'in derleme zamanı güvenlik kontrollerini atlatır.
!
Swift'te kullandığınızda , aslında, “Hey, derleyici, burada bir hata olabileceğini düşündüğünüzü biliyorum , ama bunun kesinlikle olmayacağını kesinlikle biliyorum .” Diyorsunuz.
Geçerli kodların tümü, Swift'in derleme zamanı tür sistemi veya herhangi bir dilin statik tür denetimi kutusuna sığmaz . Bir hatanın asla olmayacağını mantıksal olarak kanıtlayabileceğiniz durumlar vardır, ancak derleyiciye kanıtlayamazsınız . Bu yüzden Swift tasarımcıları bu özellikleri en başta ekledi.
Ancak, ne zaman kullanırsanız kullanın !
, bir hata için bir kurtarma yoluna sahip olmaya karar verirsiniz, yani ...
2. Ünlem işaretleri potansiyel çökmelerdir.
Ünlem işareti aynı zamanda “Swift Hey ben diyor böylece bu hata için daha iyi olduğunu asla olamaz emin benim bütün app çökmesine bunun için bir kurtarma yolu koduna benden çok.”
Bu tehlikeli bir iddia. Doğru olabilir : Kodunuzun değişmezleri hakkında çok düşündüğünüz kritik görev kodunda, sahte çıktının bir çökmeden daha kötü olması olabilir.
Ancak, !
vahşi doğada gördüğümde , nadiren çok dikkatli kullanılır. Bunun yerine, sık sık, "bu değer isteğe bağlıydı ve neden nil olabileceği veya bu durumu düzgün bir şekilde nasıl ele alacağı hakkında çok fazla düşünmedim , ancak ekleme !
derlendi ... yani kodum doğru, değil mi?"
Ünlem işaretinin kibirli olmasına dikkat edin. Yerine…
3. Ünlem işaretleri en iyi şekilde az kullanılır.
Bu !
yapıların her birinde, ?
sizi error / nil davasıyla başa çıkmaya zorlayan bir karşılığı vardır:
- Koşullu açma:
if let name = nameLabel?.text { ... }
- İsteğe bağlı maddeler:
var logo: UIImageView?
- Koşullu yayınlar:
logo.image = thing as? UIImage
- Hata durumunda Nil istisnaları:
try? NSJSONSerialization.JSONObjectWithData(data, [])
!
Kullanmak için cazip iseniz, ?
bunun yerine neden kullanmadığınızı dikkatlice düşünmek her zaman iyidir . !
İşlem başarısız olursa , programınızı çökertmek gerçekten en iyi seçenek midir? Bu değer neden isteğe bağlı / faiable?
Kodunuzun nil / error durumunda alabileceği makul bir kurtarma yolu var mı? Varsa kodlayın.
Büyük olasılıkla sıfır olamazsa, hata asla gerçekleşemezse, derleyicinin bunu bilmesi için mantığınızı yeniden çalışmanın makul bir yolu var mı? Eğer öyleyse yapın; kodunuz daha az hataya açık olacaktır.
Bir hatayı işlemek için makul bir yolun olmadığı ve hatayı görmezden gelmenin ve dolayısıyla yanlış verilerle devam etmenin - çökmekten daha kötü olduğu zamanlar vardır. Bunlar kuvvet açmanın kullanılma zamanıdır.
Düzenli olarak tüm kod tabanımı arar !
ve her kullanımını denetlerim . Çok az kullanım incelemeye dayanır. (Bu yazıdan itibaren, tüm Siesta çerçevesinin tam olarak iki örneği vardır .)
Bu , kodunuzda asla kullanmamanız gerektiği anlamına gelmez!
- sadece onu dikkatli bir şekilde kullanmanız ve asla varsayılan seçenek yapmamanız gerekir .