Closure Döndürme
Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 41 / 56.
makeCounter'ın bir closure döndürdüğünü gördünüz. Aynı yöntem, yapılandırılabilir davranışlar oluşturmanıza olanak tanır: parametreleri bir kez alın ve onları defalarca kullanan bir fonksiyonu geri alın.
func multiplier(_ k: Int) -> (Int) -> Int {
return { n in n * k }
}
let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4)) // 12
print(tenfold(4)) // 40Döndürülen closure k değişkenini yakalar, bu nedenle her bir multiplier(...) çağrısı kendi k değişkenine sahip yepyeni bir closure üretir.
Bu desen, Swift'teki "strateji" kodunun temelidir: bir yapılandırma alan ve bir closure döndüren bir fonksiyon yazın, ardından closure'ı map, filter, sorted(by:) fonksiyonlarına veya fonksiyon biçimli bir değerin beklendiği başka herhangi bir yere geçirin.
Görev
Ortaİki closure fabrikası oluşturun:
greaterThan(_ k: Int) -> (Int) -> Bool: argümanıkdeğerinden kesinlikle büyük olduğundatruedönen bir yüklem (predicate) döndürürscaleBy(_ k: Int) -> (Int) -> Int: argümanınıkile çarpan bir fonksiyon döndürür
Üç satır okuyun:
- Bir tam sayı
threshold - Bir tam sayı
scale - Virgülle ayrılmış tam sayılardan oluşan bir liste,
nums
Üç satır yazdırın:
- Eşik değerinin üzerindeki sayılar (
greaterThanclosure'ı ile filtreleyin),,ile birleştirilmiş - Aynı sayılar, ölçeklendirilmiş (
scaleByile mapleyin),,ile birleştirilmiş - Kaç tanesinin geçtiği
5 / 3 / 2,7,3,8,9 girişi için çıktı şöyledir:
7,8,9
21,24,27
3Kopya kağıdı
Bir closure fabrikası, bir parametreyi yakalayan ve onun tarafından yapılandırılmış yeni bir closure döndüren bir fonksiyondur:
func multiplier(_ k: Int) -> (Int) -> Int {
return { n in n * k }
}
let triple = multiplier(3)
print(triple(4)) // 12Her çağrı, kendine ait yakalanmış bir k değerine sahip yepyeni bir closure üretir. Döndürülen closure'lar doğrudan map, filter, sorted(by:) vb. fonksiyonlara aktarılabilir:
func greaterThan(_ k: Int) -> (Int) -> Bool {
return { n in n > k }
}
let nums = [2, 7, 3, 8, 9]
let filtered = nums.filter(greaterThan(5)) // [7, 8, 9]
let scaled = filtered.map(multiplier(3)) // [21, 24, 27]Kendin dene
let threshold = Int(readLine()!)!
let scale = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// YAPILACAK: greaterThan, scaleBy; önce filtrele sonra eşle; birleştirilmiş halini yazdır ve say
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 İstatistikleri8Closure'lar
Closure TemelleriTrailing Closure'larDeğer YakalamaClosure DöndürmeÖzel Yüksek Seviyeli FonksiyonlarÖzet - Pipeline Oluşturucu