iOS – Swift Dersleri (Collection Types)

Merhaba Arkadaşlar,
Mobilhanem’deki Swift paylaşımlarımıza Array (dizi), Set (küme) ve Dictionary‘i içeren Collection Type’lar (Tip) ile devam ediyoruz. Bu yazı içinde Collection tiplerini oluşturma, bu tipler içindeki bilgileri okuma, değiştirme ve silme gibi işlemler hakkında bilgiler bulacaksınız.

arrays_sets_dictionaries

İlk inceleyeğimiz konu olan Array’ler ile başlayalım:

Arrays (Diziler)

Aynı tipteki değerleri sıralı bir şekilde tutmamızı sağlayan collection tipidir. Aynı değer bir dizi içinde değişik sırada birden fazla bulunabilir. Swift’te dizileri uzun olarak Array<Element> şeklinde tanımlayabiliriz. Bu dizi Element tipindeki değerleri tutmamızı sağlar. Bunun kısa formu olarak [Element] şeklinde de tanımlama yapabiliriz. Bu iki tip tanımlama fonksiyonel olarak aynıdır. Biz bu yazıda kısa olan formu kullanacağız.

Aşağıda diziler ile ilgili bazı işlemleri anlamaya çalışalım:

//boş diziyi aşağıdaki gibi oluşturabiliriz:
var someInts = [Int]()
print("[Int] tipinde değerler tutan someInts dizisi \(someInts.count) eleman içerir.")
// ekran çıktısı "[Int] tipinde değerler tutan someInts dizisi 0 eleman içerir."

someInts.append(3)
// someInts dizisine 3 elemanını ekledik. Dizi artık 1 eleman içeriyor.
someInts = []
// someInts dizisindeki boşalttık, fakat dizi hala [Int] tipinde.

//initial değer vererek dizi oluşturmak istersek:
var threeDoubles = [Double](count: 3, repeatedValue: 0.0)
// 0.0 değeri 3 defa tekrarlanarak diziye eklendi.
// threeDoubles [Double] tipinde bir dizidir ve içeriği şu şekildedir -> [0.0, 0.0, 0.0]

//iki diziyi birleştirerek tek bir dizi oluturabiliriz:
var anotherThreeDoubles = [Double](count: 3, repeatedValue: 2.5)
// anotherThreeDoubles [Double] tipinde bir dizidir ve içeriği şu şekildedir -> [2.5, 2.5, 2.5] 
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles [Double] tipinde bir dizidir ve içeriği şu şekildedir -> [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

//initial olarak String tipinde bir dizi oluşturalım:
var shoppingList: [String] = ["Yumurta", "Süt"]
// shoppingList 2 elemanlı bir dizi olarak oluşturuldu.

// shoppingList dizisini [String] şeklinde belirtmeden de oluşturabiliriz.
var shoppingList = ["Yumurta", "Süt"]
// köşeli parantez içindeki elemanların tipleri aynı (String) olduğundan shoppingList dizisinin tipi otomatik olarak String olarak ayarlanır.

//Bir dizideki eleman sayısını count özelliği ile buluyoruz:
print("shoppingList dizisi \(shoppingList.count) elemana sahiptir.")
// prints "shoppingList dizisi 2 elemana sahiptir."

//Dizinin boş olup olmadığını anlamak için isEmpty özelliğini kullanıyoruz:
if shoppingList.isEmpty {
    print("shoppingList dizisi boş.")
} else {
    print("shoppingList dizisi boş değil.")
}
// ekran çıktısı "shoppingList dizisi boş değil."

//append methodu ile diziye eleman ekliyoruz:
shoppingList.append("Ekmek")
// shoppingList artık 3 elemana sahip.

//alternatif olarak diziye += ile de eleman ekleyebiliriz:
shoppingList += ["Domates"]
// shoppingList dizisi şimdi 4 elemana sahip.
shoppingList += ["Salatalık", "Peynir", "Yağ"]
// shoppingList dizisi şimdi 7 elemana sahip.

//dizinin ilk elemanına şu şekilde ulaşıyoruz:
var firstItem = shoppingList[0]
// dizinin birinci elemanı "Yumurta". (dizi indeksi 0'dan başlar.)

//dizinin ilk elemanını değiştirmek istersek:
shoppingList[0] = "Köy yumurtası"

//diziden istediğimiz uzunluktaki bir parçayı istediğimiz uzunluktaki bir parça ile değiştirebiliriz:
shoppingList[4...6] = ["Muz", "Elma"]
//bu işlem ile dizinin 4, 5 ve 6. indeksinde bulunan "Salatalık", "Peynir", "Yağ" elemanları gidiyor, yerine "Muz" ve "Elma" elemanları geliyor. 
//Dizi artık 6 elemanlı.

//diziye eleman eklerken illa ki sona eklenecek diye bir şey yok, istediğimiz sıraya ekleyebiliriz:
shoppingList.insert("Zeytin", atIndex: 0)
// shoppingList artık 7 elemanlı ve ilk elemanı "Zeytin" oluyor.

//benzer şekilde istediğimiz sıradaki elemanı diziden removeAtIndex methodu ile çıkarabiliriz:
let zeytin = shoppingList.removeAtIndex(0)
// bu işlem ile dizinin ilk elemanı olan "Zeytin" diziden çıkarıldı.
// shoppingList artık 6 elemanlı bir dizi
// zeytin sabitinin değeri "Zeytin". Diziden çıkaralan eleman removeAtIndex methodunun dönüş değeri olarak zeytin sabitine yazıldı.

//diziden son elemanı çıkarmak için:
let elma = shoppingList.removeLast()
//"Elma" elemanı diziden çıkarıldı.

//Dizinin tüm elemanlarını for döngüsü ile turlayabiliriz:
for item in shoppingList {
    print(item)
}
// Köy yumurtası
// Süt
// Ekmek
// Salatalık
// Peynir

//indeks değerleri ile turlamak için:
for (index, value) in shoppingList.enumerate() {
    print("Eleman \(index + 1): \(value)")
}
// Eleman 1: Köy yumurtası
// Eleman 2: Süt
// Eleman 3: Ekmek
// Eleman 4: Salatalık
// Eleman 5: Peynir

Sets (Kümeler)

Aynı tipteki tekil elemanlardan oluşan elemanları sırasız bir şekilde tutan collection tipidir. Elemanlarımızı sırası önemli değil ise ve her elemanın bir kere kullanılmasını garanti altına almak istersek dizi yerine Set kullanmayı tercih edebiliriz. Kümeleri Set<Element> şeklinde tanımlayabiliriz.

//boş kümayi aşağıdaki gibi initilize edebiliriz.
var letters = Set<Character>()
print("letters değişkeni Character tipi tutan bir kümedir ve \(letters.count) elemana sahiptir.")
// ekran çıktısı "letters değişkeni Character tipi tutan bir kümedir ve 0 elemana sahiptir."

//kümeye eleman eklemek için insert methodunu kullanabiliriz:
letters.insert("a")
// letters kümesi 1 eleman içerir.
letters = []
// letters kümesi şimdi boş küme fakat hala Set tipinde.

//Kümeyi başlangıç değerleri ile yaratmak istersek:
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres kümesi 3 eleman ile yaratıldı.

//bu kümeyi [String] olarak tip belirtmeksizin de yaratabilirdik:
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

//kümedeki eleman sayısını count property'si ile belirleyebiliriz:
print("Favori müziklerim \(favoriteGenres.count) tanedir.")
// ekran çıktısı "Favori müziklerim 3 tanedir."

//boş küme kontrolü isEmpty property'si ile yapılır:
if favoriteGenres.isEmpty {
    print("favoriteGenres kümesi boş kümedir.")
} else {
    print("favoriteGenres kümesi boş küme değildir.")
}
// ekran çıktısı "favoriteGenres kümesi boş küme değildir."

//kümeye eleman eklemek için insert methodu kullanılabilir:
favoriteGenres.insert("Jazz")
// favoriteGenres şimdi 4 elemanlı bir küme.

//kümeden eleman çıkarmak için remove methodunu kullanıyoruz:
if let removedGenre = favoriteGenres.remove("Rock") {
    print("\(removedGenre) silindi.")
} else {
    print("silinecek eleman bulunamadı")
}
// ekran çıktısı "Rock silindi"

//kümede bir elemanın olup olmadığı contains methodu ile kontrol edilebilir:
if favoriteGenres.contains("Funk") {
    print("Funk kümede bulunur")
} else {
    print("Funk kümede bulunmaz")
}
// ekran çıktısı "Funk kümede bulunmaz"

//kümenin elemanlarını turlamak için for döngüsü kullanılabilir:
for genre in favoriteGenres {
    print("\(genre)")
}
// Classical
// Jazz
// Hip hop

//kümedeki elemanları sıralı bir şekilde istiyorsak sort methodunu kullanıyoruz:
for genre in favoriteGenres.sort() {
    print("\(genre)")
}
// Classical
// Hip hop
// Jazz

//elemanlar alfabetik sıralandılar

Set Operations (Küme İşlemleri)

Swift’te küme ile ilgili işlemlerin daha kolay yapılabilmesi için birleşim, kesişim vb. gibi küme işlem methodları bulunur:

set_operations

Görselden de anlaşılacağı üzere yeşil alanları bulmak için ilgili fonksiyonları kullanıyoruz:

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
 
//birleşim
oddDigits.union(evenDigits).sort()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

//kesişim
oddDigits.intersect(evenDigits).sort()
// []

//çıkarma
oddDigits.subtract(singleDigitPrimeNumbers).sort()
// [1, 9]

//exclusiveOr
oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort()
// [1, 2, 9]

Altküme ve kapsar işlemleri için de methodlar mevcuttur:

subset_superset

let houseAnimals: Set = ["?", "?"]
let farmAnimals: Set = ["?", "?", "?", "?", "?"]
let cityAnimals: Set = ["?", "?"]
 
houseAnimals.isSubsetOf(farmAnimals)
// true
farmAnimals.isSupersetOf(houseAnimals)
// true
farmAnimals.isDisjointWith(cityAnimals)
// true

Dictionary

Ayni tipteki key’ler ile aynı tipteki value’ları (değer) sırasız bir şekilde tutmamıza yarayan collection tipidir. Dictionary’deki her kayıt bir key’e ve bu key değerine karşılık gelen bir value’ya sahiptir. Bir dictionary’de bir key değeri birden fazla kere bulunamaz. Kayıtlar sırasız bir şekilde tutulurlar. Dictionary’lerde key’i tanımlayıcı olarak, bu key’in value’sunu da bu tanımlayıcının anlamı olarak düşünebiliriz. Gerçek hayattaki “sözlük” ile aynı mantıktadır.

//Boş dictionary'i aşağıdaki şekilde oluşturuyoruz.
var namesOfIntegers = [Int: String]()
// namesOfIntegers boş bir [Int: String] dictionary'sidir.
 
//key değeri Int tipinde, value da String tipindedir.
namesOfIntegers[16] = "sixteen"
// şimdi namesOfIntegers dictionary'si 1 tane key-value çiftine sahiptir.
namesOfIntegers = [:]
// şimdi namesOfIntegers [Int: String] tipinde fakat boş bir dictionary'dir.

//dictionary'i oluşturacak key-value çiftlerini yan yana yazarak bir dictionary oluşturabiliriz:
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

//bu airports dictionary'sini [String]:[String] belirtmeden de oluşturabiliriz.
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

//dictionary'yi oluşturan eleman sayısını count property'si ile bulabiliriz.
print("airports dictionary'si \(airports.count) eleman içerir.")
// ekran çıktısı "airports dictionary'si 2 eleman içerir."

//Dictionary boş mu kontrolünü isEmpty property'si ile yapabiliriz:
if airports.isEmpty {
    print("airports dictionary'si boş.")
} else {
    print("airports dictionary'si boş değil.")
}
// ekran çıktısı "airports dictionary'si boş değil."

//dictionary'ye yeni eleman eklemek için:
airports["LHR"] = "London"
// airports dictionary 3 elemana sahiptir.

//eleman değiştirmek için:
airports["LHR"] = "London Heathrow"
// "LHR" key'inin değeri "London Heathrow" olarak değişti.

//yukarıdaki örneğe ek olarak bir key'in değerini updateValue methodu ile de değiştirebiliriz:
//bu şekilde kullanım ile eski değeri de kaybetmeyebiliriz.
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("DUB key'inin eski değeri \(oldValue).")
}
// ekran çıktısı "DUB key'inin eski değeri Dublin."

//eleman silmek için key'in değerini nil yapmak yeterlidir:
airports["APL"] = "Apple International"
//APL key'i eklendi.
airports["APL"] = nil
// APL key-value'su dictionary'den silindi.

//removeValueForKey ile de silme işlemi yapılabilir:
if let removedValue = airports.removeValueForKey("DUB") {
    print("Silinen airport ismi \(removedValue).")
} else {
    print("DUB key'i bulunmamaktadır!")
}
// ekran çıktısı "Silinen airport ismi Dublin Airport."

//dictionary'i oluşturan elemanları for döngüsü ile turlayabiliriz:
for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// YYZ: Toronto Pearson
// LHR: London Heathrow

//Bir dictionary'inin sadece key ya da sadece value'larını da turlayabiliriz:

for airportCode in airports.keys {
    print("Airport key'leri: \(airportCode)")
}
// Airport key'leri: YYZ
// Airport key'leri: LHR
 
for airportName in airports.values {
    print("Airport ismi: \(airportName)")
}
// Airport ismi: Toronto Pearson
// Airport ismi: London Heathrow

//Dictionary'inin key'lerini ya da value'larını bir Array'e atmak istersek aşağıdaki yolu kullanabiliriz:
let airportCodes = [String](airports.keys)
// airportCodes: ["YYZ", "LHR"]
 
let airportNames = [String](airports.values)
// airportName: ["Toronto Pearson", "London Heathrow"]

//Dictionary'ini key ve value değerlerini sıralamak istersek sort() methodunu kullanabiliriz.

Bu paylaşımımızda Array, Set ve Dictionary collection tiplerine değinmeye çalıştık. Mobilhanem‘de Swift paylaşımlarına devam edeceğiz. Bizi takipte kalın. Soru ve yorumlarınız için aşağıdaki formu kullanabilirsiniz.

Swift ile ilgili tüm paylaşımlarımıza buradan ulaşabilirsiniz.

iOS – Swift Dersleri (Fonksiyonlar (Functions))

Kaynak: developer.apple.com

0

Aycan Ayhan

2 Yorum

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?