Menu
Coddy logo textTech

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))                 // 40

Dö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.

challenge icon

Görev

Orta

İki closure fabrikası oluşturun:

  • greaterThan(_ k: Int) -> (Int) -> Bool: argümanı k değerinden kesinlikle büyük olduğunda true dönen bir yüklem (predicate) döndürür
  • scaleBy(_ k: Int) -> (Int) -> Int: argümanını k ile çarpan bir fonksiyon döndürür

Üç satır okuyun:

  1. Bir tam sayı threshold
  2. Bir tam sayı scale
  3. Virgülle ayrılmış tam sayılardan oluşan bir liste, nums

Üç satır yazdırın:

  1. Eşik değerinin üzerindeki sayılar (greaterThan closure'ı ile filtreleyin), , ile birleştirilmiş
  2. Aynı sayılar, ölçeklendirilmiş (scaleBy ile mapleyin), , ile birleştirilmiş
  3. Kaç tanesinin geçtiği

5 / 3 / 2,7,3,8,9 girişi için çıktı şöyledir:

7,8,9
21,24,27
3

Kopya 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))   // 12

Her ç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
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