2015-09-04 16 views
91

Apple, Swift 2.0'da hataların üstesinden gelmek için yeni bir yöntem geliştirdi (do-try-catch). Ve birkaç gün önce Beta 6'da daha yeni bir anahtar kelime eklendi (try?). Ayrıca, try! kullanabileceğimi biliyordum. 3 anahtar kelime arasındaki fark nedir ve ne zaman kullanılır? Eğer atabilir bir işlevi çağırarak çalıştığınızda 2 seçeneğiniz vardeneyin, deneyin! & Deneyin? fark nedir ve ne zaman kullanılır?

enum ThrowableError : ErrorType { case BadError } 

func doSomething() throws -> String { 
    if everythingIsFine { 
     return "Everything is ok" 
    } else { 
     throw ThrowableError.BadError 
    } 
} 

deneyin:

cevap

187

aşağıdaki atma fonksiyonu varsayalım.

do { 
    let result = try doSomething() 
} 
catch { 
    // Here you know about the error 
    // Feel free to handle to re-throw 
} 

Ya da sadece işlevini çağırarak deneyin ve sonraki arayan te boyunca hatayı geçmektedir:

Bir do-catch bloğu içinde çağrı çevreleyen tarafından taşıma hataları sorumluluğunu alabilir çağrı zinciri:

func doSomeOtherThing() throws -> Void {  
    // Not within a do-catch block. 
    // Any errors will be re-thrown to callers. 
    let result = try doSomething() 
}

try!

İçeride boş bir isteğe bağlı isteğe bağlı isteğe bağlı isteğe bağlı erişmeye çalıştığınızda ne olur? Evet, doğru, uygulama CRASH olacak! Aynı şey deniyor! Temel olarak hata zincirini göz ardı eder ve “yap ya da öl” durumunu bildirir. Aranan işlev herhangi bir hata atmadıysa, her şey yolunda gider. Ancak başarısız oldu ve bir hata attı, uygulamanız sadece çökecektir.

let result = try! doSomething() // if an error was thrown, CRASH! 

deneyin?

Xcode 7 beta 6'da tanıtılan yeni bir anahtar sözcük. , başarılı değerlerin görüntülenmesini engelleyen isteğe bağlı bir döndürür ve geri dönerek hata yakalar.

if let result = try? doSomething() { 
    // doSomething succeeded, and result is unwrapped. 
} else { 
    // Ouch, doSomething() threw an error. 
} 

Ya da yeni müthiş bekçi anahtar kelime kullanabilirsiniz: Bir nil çevrilmiş oluyor, sen gerçekleşti hatayı atmadan ediyoruz try? nota kullanarak burada

guard let result = try? doSomething() else { 
    // Ouch, doSomething() threw an error. 
} 
// doSomething succeeded, and result is unwrapped. 

Son bir not. Kullanmayı dene? Başarılara ve başarısızlığa daha fazla odaklandığınızda, işlerin neden başarısız olduğuna değil.

+0

İkinci kod örneğiniz ('let result = try doSomething() // 'Atlama' bloğu içinde değil '),' throws 'olarak bildirilen bir yöntem içinde çağrılmalı, değil mi? Yani, 'doSomething() 'başarısız olursa, dış yöntem de (sırayla) yapar? –

+0

Evet, tabi. Buna göre düzenlerim. – Abdurrahman

+1

Muhafız müjdesini duyurmak için tereddüt edildi –