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.
Görev
KolayAşağıdaki özellikleri taşıyan bir collect fonksiyonu tanımlayın:
- Bir tam sayı
nve bir closurebuilder: (Int) -> Stringalır 1'denn'e kadar (dahil) her biriiçinbuilder'ı ç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
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