Menu
Coddy logo textTech

Trailing Closure'lar

Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 39 / 56.

Bir closure bir fonksiyonun son argümanı olduğunda, onu parantezlerin dışına yazabilirsiniz. Bu, trailing-closure formudur ve Swift kodunun doğal okunma şekli budur.

let nums = [1, 2, 3]
// Standart biçim
let a = nums.map({ $0 * 2 })
// Trailing-closure biçimi
let b = nums.map { $0 * 2 }

Eğer closure tek argümansa, parantezler de kaybolur. Bu yüzden şimdiye kadar gördüğünüz her şey özel bir kontrol yapısı gibi okunur.

Aynı şekilde closure alan kendi fonksiyonlarınızı yazabilirsiniz:

func repeatN(_ n: Int, action: () -> Void) {
    for _ in 0..<n {
        action()
    }
}
repeatN(3) {
    print("hi")
}

Sondaki closure (trailing-closure) formu, repeatN(3) { ... } ifadesinin yerleşik bir döngü gibi okunmasını sağlar. Amaç budur: Kendi oluşturduğunuz kontrol yapıları, tıpkı standart kütüphanedekiler gibi görünür.

challenge icon

Görev

Kolay

Aşağıdaki özellikleri taşıyan bir collect fonksiyonu tanımlayın:

  • Bir tam sayı n ve bir closure builder: (Int) -> String alır
  • 1'den n'e kadar (dahil) her bir i için builder'ı çağırır ve sonuçtaki dizelerin dizisini (array) döndürür

stdin'den bir tam sayı okuyun, her değer için "i=<i>" üreten bir trailing closure kullanarak bu tam sayı ile collect fonksiyonunu çağırın ve birleştirilmiş sonucu , ile yazdırın.

4 girdisi için çıktı i=1,i=2,i=3,i=4 şeklindedir.

Kopya kağıdı

Sondaki closure (trailing closure) sözdizimi: Bir closure son argüman olduğunda, parantezlerin dışına yazılabilir. Eğer tek argüman ise, parantezler tamamen ihmal edilir.

let nums = [1, 2, 3]
let a = nums.map({ $0 * 2 }) // standart
let b = nums.map { $0 * 2 }  // sondaki closure

Özel fonksiyonlar da closure'ları aynı şekilde kabul edebilir, bu da onların yerleşik kontrol yapıları gibi okunmasını sağlar:

func repeatN(_ n: Int, action: () -> Void) {
    for _ in 0..<n {
        action()
    }
}
repeatN(3) {
    print("hi")
}

Kendin dene

let n = Int(readLine()!)!

// YAPILACAK: func collect(_ n:Int, builder:(Int)->String) -> [String]
// sonra collect(n) { ... } çağırın ve "," ile birleştirilmiş şekilde yazdırın
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