Menu
Coddy logo textTech

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 // 0

Satı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.

challenge icon

Görev

Kolay

Bir 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:

  • s bir Int olarak ayrıştırılamadığında veya ayrıştırılan değer tek sayı olduğunda .bad hatası 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
3

Kopya 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ğer

try! 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
quiz iconKendini test et

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