- 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,filtervereduceile 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.
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")["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.
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)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.
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] ?? "")")
}Baku
unknown
Optional("Tokyo")
2
Azerbaijan -> Baku
Japan -> TokyoSö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ı?
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])
}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.
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())3 true ["Baku"] ["Baku", "Ganja", "Lankaran", "Quba", "Shaki"]
| Koleksiyon | Sıra | Tekrar | Ne zaman seçilir |
|---|---|---|---|
Dizi [T] | var | olabilir | sıra önemliyse: çalma listesi, kuyruk |
Sözlük [K: V] | yok | anahtarlar tekrarlanmaz | anahtarla bulmak: kişiler, fiyatlar |
Küme Set<T> | yok | olamaz | tekrarsı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.
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() })[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;
nilatamak ç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,unionişlemlerini destekler. mapdönüştürür,filterseçer,reducebirleştirir.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
let a = [10, 20, 30] ise a[1] kaçtır?