Swift arasındaki precondition(condition: Bool, message: String)ve assert(condition: Bool, message: String)arasındaki fark nedir ?
İkisi de bana aynı görünüyor. Hangi bağlamda birini diğerinin üzerinde kullanmalıyız?
Yanıtlar:
asserttest sırasında akıl sağlığı kontrolleri içindir, oysa preconditionolursa, programınızın makul bir şekilde ilerleyemeyeceği anlamına gelen şeylere karşı korunmak içindir.
Örneğin, bir asserthatanız olup olmadığını hızlı bir şekilde bulmak için mantıklı sonuçlara sahip (örneğin bazı sınırlar içinde) bazı hesaplamalara koyabilirsiniz . Ancak, sınır dışı sonuç geçerli olabileceğinden ve kritik olmadığından, bununla birlikte göndermek istemezsiniz, bu nedenle uygulamanızı çökertmemelisiniz (sadece ilerlemeyi bir ilerleme çubuğunda görüntülemek için kullandığınızı varsayalım).
Öte yandan, bir öğe getirilirken bir dizideki bir alt simgenin geçerli olup olmadığının kontrol edilmesi a precondition. İsteğe bağlı olmayan bir değer döndürmesi gerektiğinden , dizi nesnesinin geçersiz bir alt simge istendiğinde gerçekleştirmesi için makul bir sonraki eylem yoktur .
Dokümanlardan tam metin (seçeneği tıklatmayı assertve preconditionXcode'da deneyin ):
Ön koşul
İlerlemek için gerekli bir koşulu kontrol edin.
Sevkıyat kodunda bile programın ilerlemesini engellemesi gereken koşulları tespit etmek için bu işlevi kullanın.
Oyun alanlarında ve -Onone yapılarında (Xcode'un Hata Ayıklama yapılandırması için varsayılan):
conditionyanlış olarak değerlendirilirse, yazdırmadan sonra hata ayıklanabilir bir durumda program yürütmesini durdurunmessage.In -O builds (Xcode'un Release konfigürasyonu için varsayılan):
conditionfalse olarak değerlendirilirse, program yürütmesini durdurun.In -Ounchecked yapılar
conditiondeğerlendirilmez, ancak optimizer bunun olarak değerlendirileceğini varsayabilirtrue. -Ounchecked yapılarda bu varsayımı karşılayamamak ciddi bir programlama hatasıdır.
İddia
İsteğe bağlı bir mesajla geleneksel C tarzı iddia.
Bu işlevi, test sırasında aktif olan ancak gönderi kodunun performansını etkilemeyen dahili sağlık kontrolleri için kullanın. Sürüm yapılarında geçersiz kullanımı kontrol etmek için; bakın
precondition.
Oyun alanlarında ve -Onone yapılarında (Xcode'un Hata Ayıklama yapılandırması için varsayılan):
conditionyanlış olarak değerlendirilirse, yazdırmadan sonra hata ayıklanabilir bir durumda program yürütmesini durdurunmessage.In -O derlemeleri (Xcode'un Release konfigürasyonu için varsayılan)
conditiondeğerlendirilmez ve hiçbir etkisi yoktur.In -Ounchecked yapılar
conditiondeğerlendirilmez, ancak optimizer bunun olarak değerlendirileceğini varsayabilirtrue. -Ounchecked yapılarda bu varsayımı karşılayamamak ciddi bir programlama hatasıdır.
data["name"]olmadığı yerde JSON okuyan bir koruma ifadesi hayal edin , ancak olması gerekir. Korumanın içinde bir iddiaya sahip olmak..else {} çökerek ve beni soruna getirerek hatamı yakalamama yardımcı olur. Benzer şekilde, bu kod üretimde olsaydı, iddia programı çökertmezdi ve kullandığım yedekleme kodu ( return nil) devralırdı.
Swift iddialarını buldum - eksik kılavuz yardımcı olacak
debug release release
function -Onone -O -Ounchecked
assert() YES NO NO
assertionFailure() YES NO NO**
precondition() YES YES NO
preconditionFailure() YES YES YES**
fatalError()* YES YES YES
Ve Swift Evolution hakkındaki ilginç tartışmalardan
- assert: dahili hatalar için kendi kodunuzu kontrol etme
- ön koşul: müşterilerinizin size geçerli argümanlar verdiğini kontrol etmek için.
Ayrıca, ne kullanacağınız konusunda dikkatli olmanız gerekir, bkz. İddia , Hata ve Optimizasyon Düzeyi
precondition()ve preconditionFailure()vardır aynı davranışları sahip . Bu işlevler arasındaki fark şudur: preconditioniçeride bir koşula ihtiyaç duyarken, preconditionFailuresadece dışarı atılır.
preconditionUygulamanızı gemi zaman size böylece sürüm modunda aktiftir ve önkoşul uygulaması sona erer başarısız oldu.
Assertvarsayılan olarak sadece hata ayıklama modunda çalışır.
NSHipster'da ne zaman kullanılacağına dair bu harika açıklamayı buldum:
İddialar, klasik mantıktan ödünç alınmış bir kavramdır. Mantıkta iddialar, bir ispat içindeki önermeler hakkındaki ifadelerdir. Programlamada iddialar, programcının beyan edildikleri yerde uygulama hakkında yaptığı varsayımları ifade eder.
Bir yöntem veya işlevin yürütülmesinin başlangıcında ve sonunda kodun durumuna ilişkin beklentileri tanımlayan ön koşullar ve son koşullar kapasitesinde kullanıldığında, iddialar bir sözleşme oluşturur. Onaylar, belirli ön koşullar başarısız olduğunda yürütmeyi önlemek için çalışma zamanında koşulları zorlamak için de kullanılabilir.
ön koşul
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
İlerlemek için gerekli bir koşulu kontrol edin.
iddia etmek
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
İsteğe bağlı bir mesajla geleneksel C tarzı iddia.
Bu işlevi, test sırasında aktif olan ancak gönderi kodunun performansını etkilemeyen dahili sağlık kontrolleri için kullanın. Sürüm yapılarında geçersiz kullanımı kontrol etmek için; ön koşula bakın.
Oyun alanlarında ve -Onone yapılarında (Xcode'un Hata Ayıklama yapılandırması için varsayılan): koşul yanlış olarak değerlendirilirse, mesajı yazdırdıktan sonra hata ayıklanabilir durumda program yürütmeyi durdurun.
Sadece 2 sentimi eklemek istedim. Kodunuza istediğiniz kadar iddia ekleyebilirsiniz. Kodunuzu bu iddialarla gönderebilirsiniz. Swift, bu kod bloklarını üretim uygulamaları için DEĞERLENDİRMEZ. Bunlar yalnızca hata ayıklama modu durumunda değerlendirilir.
Ayrıca swift.org'dan resim ekleniyor
Ayrıca, ön koşullarda durumun böyle olmadığını unutmayın. Ön koşullarla gönderilen kod çökecek ve ön koşullar doğru olarak değerlendirilmezse uygulama sona erecektir.
Kısacası, iddialar hata ayıklama içindir, ancak üretimi etkilemeden gönderilebilir. Onaylar, hata ayıklama modunda değerlendirilecek, ancak üretimde değerlendirilmeyecektir.
Ve
Ön Koşullar, üretim ortamında beklenmedik şeylerin olmamasını sağlamak içindir. Bu koşullar değerlendirilir ve yanlış olarak değerlendirilmeleri durumunda uygulamanızı sonlandırır