Menu
Coddy logo textTech

İşlem Hatları Oluşturma

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

Topladığınız metotlar, map, filter, reduce, compactMap, flatMap, sorted(by:), günlük Swift araç takımıdır. Gerçek kod bunları birbirine bağlar.

struct Order {
    let item: String
    let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
    .filter { $0.qty > 0 }
    .sorted { $0.qty > $1.qty }
    .map { $0.item }
print(names)                  // ["milk", "apple"]

Zinciri yukarıdan aşağıya okuyun: boş olmayan siparişleri tutun, miktara göre azalan şekilde sıralayın, ardından sadece isimleri tutun.

İşlem hatları (pipelines), her adımın tek bir amacı olduğunda başarılı olur. Bir closure içinde aynı anda iki şey yaptığınızı fark ederseniz (eşleme (mapping) ve filtreleme (filtering)), bunları iki adıma bölün. Zincir büyüdükçe okunabilirliğini korur.

challenge icon

Görev

Orta

Tek bir giriş satırı okuyun: virgülle ayrılmış name:price:qty girdileri listesi. Bazı girdiler hatalı biçimlendirilmiştir ve atlanmalıdır: fiyatı veya miktarı geçerli bir tam sayı olmayan her girdi.

qty > 0 olan her geçerli girdi için, toplam (price * qty) değerine göre azalan düzende sıralanmış, şu formatta bir satır üreten bir işlem hattı oluşturun:

<name>: <total>

Öğe başına satırlardan sonra, genel toplamı içeren bir özet satırı yazdırın: Sum: <n>.

apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7 girdisi için çıktı şöyledir:

milk: 20
salt: 14
apple: 6
Sum: 40

Kopya kağıdı

Yüksek seviyeli fonksiyonları (higher-order functions) zincirlemek, her adımın tek bir amacının olduğu okunabilir boru hatları (pipelines) oluşturur:

let names = orders
    .filter { $0.qty > 0 }
    .sorted { $0.qty > $1.qty }
    .map { $0.item }

Yaygın boru hattı metotları: filtercompactMapsorted(by:)mapreduce. Eğer bir closure aynı anda iki iş yapıyorsa (örneğin eşleme ve filtreleme), onu iki adıma bölün.

Kendin dene

let entries = readLine()!.components(separatedBy: ",")

// TODO: compactMap (ayrıştırma), filter (miktar > 0),
// sorted (toplam azalan), map (biçimlendirme) kullanarak işlem hattı; satırları + Toplamı yazdır
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