Menu
Coddy logo textTech

Değer Yakalama

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

Bir closure, oluşturulduğu sırada kapsamda (scope) olan değişkenleri hatırlar. Closure gövdesi, çevreleyen fonksiyon döndükten sonra bile bu değişkenleri okuyabilir ve hatta daha sonra değiştirebilir. Buna yakalama (capturing) denir.

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let next = makeCounter()
print(next())                    // 1
print(next())                    // 2
print(next())                    // 3

Her bir makeCounter çağrısı size yepyeni bir count verir, bu nedenle iki sayaç asla durum paylaşmaz:

let a = makeCounter()
let b = makeCounter()
print(a())                       // 1
print(b())                       // 1
print(a())                       // 2

Yakalama (capturing), closure'ları düz fonksiyonlardan daha güçlü kılan şeydir: yanlarında durum (state) taşırlar. Aynı numarayı JavaScript, Python ve diğer pek çok dilde göreceksiniz.

challenge icon

Görev

Orta

Küçük bir sayaç fabrikası oluşturun.

() -> Int tipinde bir closure döndüren makeCounter(start: Int, step: Int) fonksiyonunu tanımlayın. Closure'a yapılan her çağrı bir sonraki değeri döndürür: ilk çağrı start değerini, bir sonraki start + step değerini, ondan sonraki start + 2*step değerini döndürür ve bu şekilde devam eder.

Girdiden üç tam sayı okuyun: start, step ve n. start ve step değerlerini kullanarak bir sayaç oluşturun, ardından bu sayacı n kez çağırın ve her sonucu kendi satırında yazdırın.

5 / 3 / 4 girdisi için çıktı şöyledir:

5
8
11
14

Kopya kağıdı

Closure'lar, çevreleyen kapsamdaki değişkenleri yakalayarak dış fonksiyon döndükten sonra bile durumu taşırlar:

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let next = makeCounter()
print(next()) // 1
print(next()) // 2

Fabrika fonksiyonuna yapılan her çağrı, bağımsız bir yakalanmış değişken oluşturur; iki sayaç asla durum paylaşmaz.

Kendin dene

let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!

// YAPILACAK: Mevcut değeri yakalayan makeCounter(start:step:) -> () -> Int fonksiyonunu oluşturun
// ardından bunu n kez çağırın ve her sonucu 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