Swift 4 Sözlükler (Dictionaries) #15

Özcan Akkoca
Etiya
Published in
3 min readJun 29, 2017

--

Sözlük anahtar-değer çiftlerinden oluşan bilgileri tutan ve anahtar verildiğinde onun değerine hızlı biçimde (algoritmik olarak) erişmeyi sağlayan veri yapılarıdır. Swift’te nasıl diziler temel bir veri türü ise benzer biçimde sözlükler de temel bir veri türüdür. Bu veri yapıları programlama dillerinin kütüphanelerinde genellikle hash tabloları ya da dengelenmiş ikili ağaçlar biçiminde oluşturulmaktadır.

Swift’te sözlükler köşeli parantezler içerisinde ‘:’ atomu ile ayrılan anahtar ve değer türleriyle temsil edilmektedir. Örneğin anahtar türü K ve değer türü V olan bir sözlük [K: V] biçiminde temsil edilir. [K: V] türü Swift’in standart kütüphanesindeki Dictionary generic yapısının Dictionary<K, V> açılımı ile eşdeğerdir.

Bir sözlük boş olarak aşağıdaki gibi yaratılabilir:

var a: [String: Int] = [String: Int]()

Bir sözlük nesnesi köşeli parantezler içerisinde anahtar ve değerler ‘:’ atomu ile ayrılarak da otomatik biçimde yaratılabilir. Örneğin:

var a: [String: Int] = [“Eskişehir”: 26, “İstanbul”: 34, “Kocaeli”: 41, “Konya”: 43]

Aynı bildirim tür beelirtmeden de aşağıdaki gibi yapılabilirdi:

var a: [“Eskişehir”: 26, “İstanbul”: 34, “Kocaeli”: 41, “Konya”: 43]

Burada yine a değişkeni [String: Int] türündendir. Benzer biçimde aşağıdaki bildirim de geçerlidir:

var a: Dictionary<String, Int> = [“Eskişehir”: 26, “İstanbul”: 34, “Kocaeli”: 41, “Konya”: 43]

Sözlüklerin count property’si sözlükteki eleman sayısını bize vermektedir. Örneğin:

var a = [“Eskişehir”: 26, “İstanbul”: 34, “Kocaeli”: 41, “Konya”: 43]

print(a.count) // 4

Sözlük türünün en önemli kullanılma nedeni anahtar verildiğinde değeri hızlı bir biçimde (algoritmik yöntemlerle) elde etmektir. Anahtara karşı değerin elde edilmesi için Dicitionary yapısının subscript elemanı kullanılır. Yapının tek parametreli subscript elemanında biz köşeli parantezler içerisinde anahtarı verirsek bu subscript bize değeri seçeneksel olark verir. Örneğin:

var d: [String : Int] = [“Ali”: 123, “Veli”: 234, “Selami”: 532, “Ayşe”: 777, “Fatma”: 345]

if let v = d[“Selamixxx”] {

print(v)

}

else {

print(“anahtar yok!”)

}

Anahtarı vererek değeri elde ettiğimiz tek parametreli subscript eleman read/write bir elemandır. Sözlüğe eleman ekleme bu subscript elemanın set bölümüyle yapılmaktadır. Örneğin:

var d: [String : Int] = [String: Int]()

d[“Ali”] = 123

d[“Veli”] = 234

d[“Selami”] = 53

d[“Ayşe”] = 777

d[“Fatma”] = 345

Aynı anahtar zaten varsa bu işlem o anahtarın değerinin güncellenmesine yol açar. (Örneğin yukarıdaki sözlüğe biz bir tane daha “Ali” anahtarını girersek onun değerini değiştirmiş oluruz.

Aynı işlem Dictionary yapısının updateValue metodu ile de yapılabilir:

mutating func updateValue(_ value: Value, forKey key: Key) -> Value?

Metodun birinci parametresi değeri, ikinci parametresi anahtarı alır. Değer varsa onu günceller geri dönüş değeri olarak önceki değeri bize seçeneksel olarak verir. Değer yoksa onu ekler ve nil değerine geri döner. Örneğin:

if let oldVal = d.updateValue(999, forKey: “Selami”) {

print(“Değer güncellendi, eski değer = \(oldVal)”)

}

else {

print(“anahtar/değer eklendi”)

}

Dictionary yapısının keys ve values isimli property’leri bize sözlüğün içerisindeki tüm anahtarları ve değerleri bir collection olarak verir. Örneğin:

var d: [String : Int] = [“Ali”: 123, “Veli”: 234, “Selami”: 532, “Ayşe”: 777, “Fatma”: 345]

for k in d.keys {

print(k)

}

for v in d.values {

print(v)

}

Yapının keys ve values property’lerinin bize elemanları sıralı vermediğine dikkat ediniz. Çünkü sözlük organizasyonu anahtar verildiğinde değerin hızlı bir biçimde elde edilmesi amacıyla oluşturulmuştur.

Aslında biz bir sözlüğü de doğrudan for in yapısı ile dolaşabiliriz. Bu durumda her adımda biz (K, V) biçiminde bir tuple elde ederiz. Örneğin:

var d: [String : Int] = [“Ali”: 123, “Veli”: 234, “Selami”: 532, “Ayşe”: 777, “Fatma”: 345]

for t in d {

print(“Key = \(t.0), Value = \(t.1)”)

}

Eleman silmek için yapının removeAtIndex metodu kullanılır. Fakat bu metot bizden anahtarı alarak silmeyi yapmaz. Bizden indeks değerini ister. Indeks değeri yine Int türden değildir. Daha önce String yapısında anlatıldığı gibi yapının içerisinde bildirilmiş olan Index isimli bir yapı türündendir. Dictionary yapısının startIndex ve endIndex property’leri bize ilk elemanın ve sondan bir sonraki elemanın Indeks değerlerini verir. Örneğin sözlükteki ilk elemanı şöyle silebiliriz:

var d: [String : Int] = [“Ali”: 123, “Veli”: 234, “Selami”: 532, “Ayşe”: 777, “Fatma”: 345]

d.removeAtIndex(d.startIndex)

for e in d {

print(“\(e)”)

}

Yapının removeAll metodu sözlük içerisindeki tüm eelemanları siler. İsteğe bağlı argümanla kapasite korumasının yapılıp yapılmayacağı belirlenebilmektedir.

--

--