try? ve try!
Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 46 / 56.
Bazen bir fonksiyonun hangi hatayı fırlattığı umurunuzda olmaz, sadece bir sonuç veya bir yedek istersiniz. Swift size iki kısa form sunar.
try? fırlatılan herhangi bir hatayı nil değerine dönüştürür. Sonuç, fonksiyonun dönüş tipinin bir Optional halidir:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0Satır içi bir varsayılan değer için bunu ?? ile eşleştirin. Bu, "bu şeyi çağır, her iki durumda da bana bir değer ver" ifadesinin en kısa versiyonudur.
try!, "Bunun hata fırlatmayacağını biliyorum" der. Eğer fırlatırsa, programınız çöker. Bunu yalnızca çağrının güvenli olduğunu kanıtlayabildiğiniz durumlarda kullanın; günlük kodda, bir yedekleme ile try? kullanımını veya tam do/catch yapısını tercih edin.
Görev
KolayBir bad durumu içeren NumError: Error yapısını tanımlayın. Aşağıdaki özelliklere sahip, hata fırlatabilen (throwing) bir parseEven(_ s: String) throws -> Int fonksiyonu tanımlayın:
sbirIntolarak ayrıştırılamadığında veya ayrıştırılan değer tek sayı olduğunda.badhatası fırlatır- Aksi takdirde ayrıştırılan tam sayıyı döndürür
Girdi olarak tek bir satır okuyun: virgülle ayrılmış dizelerden oluşan bir liste. Her biri için, ya ayrıştırılmış çift tam sayıyı ya da -1 değerini elde etmek için try? ve ardından ?? -1 kullanın.
Sonuçta elde edilen tam sayıları, aralarına , koyarak sırayla yazdırın. Ardından ikinci bir satırda, -1 olarak dönen değerlerin sayısını yazdırın.
4,7,abc,8,11,2 girdisi için çıktı şöyledir:
4,-1,-1,8,-1,2
3Kopya kağıdı
try? fırlatılan bir hatayı nil değerine dönüştürerek bir Optional döndürür:
let result = try? risky() // hata durumunda nil
let safe = (try? risky()) ?? 0 // yedek değertry! eğer çağrı hata fırlatırsa çöker — yalnızca çağrının güvenli olduğundan emin olduğunuzda kullanın:
let value = try! guaranteedSafe()Kendin dene
let parts = readLine()!.components(separatedBy: ",")
// YAPILACAK: enum NumError; func parseEven(_:) throws -> Int;
// her bir parça için, (try? parseEven(part)) ?? -1
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Stringler Derinlemesine
Sayma ve İndekslerBüyük-Küçük Harf ve KırpmaStringlerde AramaBölme ve BirleştirmeAlt Stringleri DeğiştirmeÖzet - Kullanıcı Adı Kontrolü4Kümeler
Küme OluşturmaBirleşim ve KesişimFark ve Simetrik FarkAlt Küme ve Üst KümeÖzet - Etiket Filtresi7Proje - Alışkanlık Takibi
Projeye Genel BakışTamamlandı Olarak İşaretle10Proje - Quiz Motoru
Projeye Genel BakışSoruları Sorma2Aralıklar ve Adımlar
Kapalı ve Yarı AçıkStride (Adım)Aralık MetotlarıSwitch İçinde AralıklarÖzet - Takvim Izgarası5Yüksek Mertebeden Fonksiyonlar Bölüm 1
MapFilterReduceMap, filter, reduce zincirlemeÖzet - Kelime İstatistikleri