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()) // 3Her 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()) // 2Yakalama (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.
Görev
OrtaKüçü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
14Kopya 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()) // 2Fabrika 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
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