İçeriğe geç
Educora
Orta18 dk5 / 14

Koleksiyonlar: diziler, sözlükler, kümeler

Çok sayıda değeri dizilerde, sözlüklerde ve kümelerde sakla, onları değiştir ve `map`, `filter`, `reduce` ile tek satırda işle.

Kendini test et
Bu derste öğreneceklerin
  • Dizi oluşturmak, elemanlara indeksle erişmek, eleman eklemek ve silmek
  • Sözlükler ve kümelerle çalışmak ve hangi koleksiyonun ne zaman uygun olduğunu seçmek
  • Koleksiyonları map, filter ve reduce ile dönüştürmek

Bir müzik uygulamasında çalma listesi şarkıları belirli bir sırayla tutar, telefon rehberi numarayı isme göre bulur, “beğenilenler” listesinde ise aynı fotoğraf iki kez bulunamaz. Swift'te bu üç durum için üç koleksiyon vardır: dizi (Array), sözlük (Dictionary) ve küme (Set).

Diziler

Dizi, aynı türdeki değerlerin sıralı bir listesidir ve köşeli parantez içinde yazılır. Her elemanın bir indeksi vardır ve sayma 0'dan başlar: ilk eleman fruits[0]'dır. Dizinin türü [String], [Int] gibi yazılır. var ile tanımlanan dizi değiştirilebilir, let dizisi ise değiştirilemez.

Swift
var fruits = ["apple", "banana", "cherry"]
print(fruits)
print(fruits[0])
print(fruits.count)

fruits.append("pear")
fruits.insert("kiwi", at: 1)
print(fruits)

fruits.remove(at: 2)
print(fruits)
print(fruits.contains("pear"))
print(fruits.first ?? "empty")
Beklenen çıktı
["apple", "banana", "cherry"]
apple
3
["apple", "kiwi", "banana", "cherry", "pear"]
["apple", "kiwi", "cherry", "pear"]
true
apple

first ve last opsiyonel döndürür, çünkü dizi boş olabilir. Dizi üzerinde döngü için for-in, hem indeks hem değer gerekiyorsa enumerated() kullanılır. sorted() sıralanmış yeni bir dizi, max() ve min() ise en büyük ve en küçük elemanı (opsiyonel olarak) döndürür.

Swift
let scores = [85, 92, 78]
for (index, score) in scores.enumerated() {
    print("\(index + 1). \(score)")
}
print(scores.sorted())
print(scores.max() ?? 0)

let empty: [Int] = []
print(empty.isEmpty)
Beklenen çıktı
1. 85
2. 92
3. 78
[78, 85, 92]
92
true

Sözlükler

Sözlük, anahtar: değer çiftlerini saklar ve değeri indeksle değil, anahtarla bulur. Türü [String: String] gibi yazılır. Anahtarla okunan değer her zaman opsiyoneldir, çünkü böyle bir anahtar olmayabilir; burada ?? çok işe yarar. Bir anahtara nil atamak çifti siler.

Swift
var capitals = ["Azerbaijan": "Baku", "Georgia": "Tbilisi"]
capitals["Japan"] = "Tokyo"

print(capitals["Azerbaijan"] ?? "unknown")
print(capitals["France"] ?? "unknown")
print(capitals["Japan"])

capitals["Georgia"] = nil
print(capitals.count)

for country in capitals.keys.sorted() {
    print("\(country) -> \(capitals[country] ?? "")")
}
Beklenen çıktı
Baku
unknown
Optional("Tokyo")
2
Azerbaijan -> Baku
Japan -> Tokyo

Sözlüğün en faydalı kullanımlarından biri saymaktır. Bir sınıf en sevdiği hayvanı seçmek için oylama yaptı; her hayvan kaç oy aldı?

Swift
let votes = ["cat", "dog", "cat", "fish", "cat", "dog"]
var counts: [String: Int] = [:]

for vote in votes {
    counts[vote, default: 0] += 1
}

for animal in counts.keys.sorted() {
    print(animal, counts[animal, default: 0])
}
Beklenen çıktı
cat 3
dog 2
fish 1

Kümeler

Küme (Set), tekrarsız değerlerden oluşan ve sırası olmayan bir topluluktur. Aynı değeri iki kez eklersen yalnızca bir kez saklanır. Kümeler bir elemanın olup olmadığını çok hızlı kontrol eder ve matematikteki gibi kesişim (intersection) ve birleşim (union) işlemlerini destekler.

Swift
var visited: Set = ["Baku", "Ganja", "Baku", "Shaki"]
print(visited.count)

visited.insert("Lankaran")
print(visited.contains("Ganja"))

let friendVisited: Set = ["Baku", "Quba"]
print(visited.intersection(friendVisited).sorted())
print(visited.union(friendVisited).sorted())
Beklenen çıktı
3
true
["Baku"]
["Baku", "Ganja", "Lankaran", "Quba", "Shaki"]
KoleksiyonSıraTekrarNe zaman seçilir
Dizi [T]varolabilirsıra önemliyse: çalma listesi, kuyruk
Sözlük [K: V]yokanahtarlar tekrarlanmazanahtarla bulmak: kişiler, fiyatlar
Küme Set<T>yokolamaztekrarsızlık ve hızlı kontrol: etiketler, gezilen şehirler

`map`, `filter` ve `reduce`

Koleksiyonları döngü yazmadan işlemek için üç güçlü metot vardır. map her elemanı dönüştürüp yeni bir dizi oluşturur, filter yalnızca koşula uyan elemanları tutar, reduce ise tüm elemanları tek bir değerde birleştirir. Süslü parantezdeki kod bir closure'dır (kapanış), $0 ise o anki elemandır; closure'ları bir sonraki derste ayrıntılı öğreneceksin.

Swift
let prices = [4, 12, 7, 20]

let doubled = prices.map { $0 * 2 }
let cheap = prices.filter { $0 < 10 }
let total = prices.reduce(0, +)

print(doubled)
print(cheap)
print(total)
print(prices.filter { $0 >= 10 }.reduce(0, +))

let names = ["aysel", "murad"]
print(names.map { $0.uppercased() })
Beklenen çıktı
[8, 24, 14, 40]
[4, 7]
43
32
["AYSEL", "MURAD"]

Önemli noktalar

  • Dizi sıralıdır, indeksleri 0'dan başlar; sınırın dışına çıkmak programı çökertir.
  • Sözlük değeri anahtarla bulur ve opsiyonel döndürür; nil atamak çifti siler.
  • Sözlüklerin ve kümelerin sırası yoktur; sabit bir sonuç için sorted() kullan.
  • Küme tekrarsız değerleri tutar ve intersection, union işlemlerini destekler.
  • map dönüştürür, filter seçer, reduce birleştirir.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
let a = [10, 20, 30] ise a[1] kaçtır?