Merhaba arkadaşlar ,
mobilhanem.com sitemiz için anlattığımız/yayınladığımız Swift Dersleri serimize bu yazımızda Swift Sets ile devam edeceğiz. Bir önceki yazımızda Swift Dizi konusundan bahsetmiştik. Bu derse başlamadan önce xcode’u kurmak ve playground üzerinde swift kodu yazabilmek için bu dersimizi okumanızı tavsiye ederim.
Swift Sets Nedir ?
Öncelikle Sets collection tiplerimizden biridir. Tıpkı array ‘ler gibi. Sets aynı türdeki verileri saklamaya yarar. Diziler ile çok benzerlerdir.
Swift Sets ile Array Farkı
Sets ile Array ‘lerin çok benzer olduğunu söyledik. Ayrıldıkları en önemli noktalardan biri array ‘lerde aynı değer array ‘in içerisinde yer alabiliyorken bu durum Sets için geçerli değildir. Yani Sets içerisinde aynı değeri bulundurmaz. İçerisindeki bütün değerler birbirlerinden farklı olmak zorundadır. Bir başka ayırt edici özellik ise array ‘ler sıralı iken Sets ‘te böyle bir durum söz konusu değildir. Tabi ki kendimiz sıralayabiliriz 🙂
Swift Sets Çalışma Mantığı
Sets yapılarında array ‘lerdeki gibi bir sıralı olma durumunun olmadığını söylemiştim. Şimdi de Array ‘lerini çalıma mantığını anlatırken verdiğimiz örneğin aynısının Sets yapısında nasıl gözüktüğüne bir göz atalım.
Resimde de görüldüğü gibi string türünde değerlerimiz sıralı olmayan bir şekildedir. Ve tıpa tıp aynı değerden bulunmamaktadır. Bu değerleri bir komutla alfabetik olarak sıralı hale getirebiliriz.
Swift Boş Sets Oluşturma
Vazgeçilmez bir başlangıç olarak boş bir Sets türünde değişkenimizi yaratabiliriz artık ,
var selamlama = Set<String>()
Ve tanımladık gayet kolay ve kısa bir biçimde 🙂 Burada selamlama değişkenimiz Set türünde ve içerisinde string değerler barınacaktır diye belirtmiş olduk. Peki türünü belirtmeden ilk değer ataması (Array konusunda yaptuğımız gibi) yapabilir miyiz ?
var selamAlma : Set = ["Aleykum Selam"]
Türünü belirtmeden selamAlma değişkenimizin Set türünde olacağını ve içerisinde “Aleykum Selam” (String türünde) değerinin olacağını belirttik ve derleyicimiz atadığımız bu değerin string olduğunu algılayıp selamAlma değişkenimizin string değerler barındıracağını anlamış oldu. Bu aşamadan sonra selamAlma değişkenimizin içerisine string olmayan bir değer atayamayız. Aynı işlemi türümüzü belirterek yapmakta mümkündür ve belirtmek daha iyi olabilir.
var selamAlma : Set<String> = ["Aleykum Selam"]
Ve aynı işlemi türümüzü belirterek yaptık.
Swift Sets ‘e Değer Ekleme
Array ‘de kullandımığımız append komutunu burada kullanamamaktayız fakat hemen hemen aynı karşılığa gelen insert komutumuz bulunmaktadır. Bu komut set değişkenimize kolaylıkla yeni bir değer ekleyebiliriz.
selamlama.insert("Selam") selamlama.insert("Nasılsınız ?")
selamlama değişkenimizin içerisinde artık string türünde bir değerimiz var.
Swift Sets Eleman Silme
insert komutu ile ekleme yapabildiğimiz gibi remove komutu ilede istediğimiz değeri silebilmekteyiz.
selamlama.remove("Nasılsınız ?")
selamlama değişkenimizin içerisindeki “Nasılsınız ?” değerini böylelikle çıkarmış olduk. Bu şekilde yaptığımızda eğer input olarak verdiğimiz değer yoksa nil değeri döner ve bu koşulu if yapısında kullanmışsanız derleyicimiz hata verir. Bu sorunu gidermek için ileride Optionals konusunu anlatacağım orada bu sorunu nasıl giderebileceğimizi öğrenebileceksiniz.
Swift Sets Değer Kontrolü -Array İçinde Geçerli-
Sets türündeki bir değişkenimizin içerisinde herhangi bir değer araması yapabiliriz. contains komutu ile sets türündeki ve array türündeki değişkenlerimizin içerisinde belirli bir değeri arayabiliriz.
selamlama.contains("Selam")
İşlemi bize true ya da false değerlerini döndürür. Gözümüze daha hoş gelebilmesi için if yapısı kullanarak yapalım .
if selamlama.contains("Selam"){ print("selamlama 'nın içerisinde Selam vardır") } else { print("selamlama 'nın içeriisnde Selam Yoktur") }
Yukarıdaki kod bloğu selamlama ‘nın içerisinde “Selam” değerinin geçip geçmediğini kontrol eden bir yapıdır. Eğer geçiyorsa yani selamlama.contains(“Selam”) sonucu true ise ekrana “selamlama ‘nın içerisinde Selam vardır” yazısını bastıracaktır . Eğer geçmiyor ise ekrana “selamlama ‘nın içeriisnde Selam Yoktur” yazısını bastıracaktır. insert komutu ile “Selam” değerimizi önceden eklediğimiz için true değeri döner ve if bloğumuzun içerisine girer.
Swift Sets Boş mu ? Dolu mu ?
Tıpkı array ‘lerde yaptığımız gibi .isEmpty komutu ile set değişkenimizin içerisinde eleman bulunup bulunmadığını kontrol edebiliriz hemen küçük bir örnek yapalım ,
if selamlama.isEmpty { print("selamlama boştur") }else { print("selamlama doludur") }
Burada isEmpty komutunun çalışma mantığını anlatmayacağım.
var arrayKonusunuOkuma = false if arrayKonusunuOkuma { print("Sorun yok :)") }else { print("Bu Adresten Okuyabilirsiniz -> https://www.mobilhanem.com/swift-array-kullanimi/") }
Swift Sets Bütün Elemanları Ekrana Yazdırma
Array ‘lerde bütün elemanları ekrana bastırmak için yaptığımız işlemin aynısını yapacağız.
for kelimeler in selamlama { print("\(kelimeler)") }
Şeklinde selamlama değişkenimizin içerisindeki değerlerimizi tek tek ekrana bastırabilmekteyiz.
Swift Sets Eleman Sayısını Bulma
Sık sık dediğim gibi yine söylemek durumundayım array ‘lerde yaptığımız işlemin tıpa tıp aynısını yapacağız ve yine count komutunu kullanacağız .
print(selamlama.count)
Değişkenimizin ismini yazdıktan sonra .count diyerek değişkenimizin içerisinde bulunan elemanların sayısını görebilmekteyiz.
Swift Sets Sıralama
Önceden söylediğim gibi sets içinde sıralama yapmaz yeni bir eleman eklendiğinde ya da silindiğinde tekrar tekrar sıralama yapmaz. Belirli bir sıralama algoritması yoktur. Fakat biz sorted komutu ile alfabetik olarak sıralayabiliriz.
for kelimeler in selamlama.sorted() { print(kelimeler) }
Şeklinde kullanarak selamlama değişkenimizin içerisindeki kelimelerimizi alfabetik olarak sıraladık ve sıraladığımız şekliyle ekrana bastırdık. Çıktıda ilk görmemiz gereken değer “Nasılsınız ?” ve ardından “Selam” ‘ı görmemiz gerekmektedir. Çünkü alfabetik olarak sıralama yaparken harflerden önce gelen daha küçük olduğu için ilk olarak o değeri göstermektedir. “N” karakterinin ASCII karşılığı decimal olarak 78 iken “S” karakterinin ise 83 ‘tür.
Swift Sets Temel İşlemler
Temel işlemlerden kastım , iki set değişkeninin kesişimini (intersection) , simetrik farkını (symmetricDifference) , birleşimini (union) ve bir değişkenin diğer değişkenden farkını (subtracting) bulma işlemleridir. Öncelikle bu işlemler tam olarak ne anlama gelir onu anlamamız lazım . Aşşağıda ki görselide tam olarak bunun için hazırladım 🙂 Başlamadan önce , aşağıda geçen a ve b ifadeleri iki farklı set türünde değişkenleri ifade etmektedir.
Evet temel operatörleri öğrendiğimize göre bu işlemleri kullanmaya başlayabiliriz.
Öncelikle kullanacağımız değişkenlerimizi tanımlamakla başlayalım,
let tekSayilar: Set = [1, 3, 5, 7, 9] let ciftSayilar: Set = [0, 2, 4, 6, 8]
Değişkenlerimizi tanımladıktan sonra ilk olarak intersection işlemini yapalım ,
print(tekSayilar.intersection(ciftSayilar))
Evet intersection işlemimizi doğru yaptık fakat her hangi bir çıktı göremedik merak etmeyin bu çok doğal çünkü intersection işlemi iki kümenin kesişimini bulduğu için tek sayılar ile çift sayılar kümesinin kesişimide olmadığı için bu sonuç gayet doğaldır.
Şimdide symmetric difference işlemini yapalım ve sonucumuzu görelim ,
print(tekSayilar.symmetricDifference(ciftSayilar).sorted())
Çıktı olarak tekSayilar ile ciftSayilar değişkenlerimizin birleşimini gördük. Çünkü symmetric difference işlemi iki kümenin birbirinden farkını alıp birleştirir. Bizim bu iki kümemizin kesişimi olmadığından farklarının birleşimi direkt birbirlerine eşit olacaktır. Bu durum için union işlemide aynı sonucu verecektir.
Evet geldik subtracting işlemine , bu herkesin vakti zamanında , zamanını bolca geçirdiği ve hala lise 3 ‘ e geldik yinemi kümeler ?? dediğimiz kümelerdeki fark işlemidir 🙂
print(tekSayilar.subtracting(ciftSayilar))
Ve bu işlemde bize tekSayilar kümesinin kendisini verecektir.
Swift Set Membership and Equality
Burada kullanacağımız komutlar ve acıklamaları şu şekilde olacaktır ,
+ isSubset
-Bir kümedeki bütün değerlerin bir başka kümede olup olmağını belirlemek için kullanılır.
+isSuperset
-Bir kümenin diğer kümeyi kapsayıp kapsamadığını belirlemek için kullanılır.
+isDisjoint
-İki kümenin ortak değerlere sahip olup olmadığını belirleme yöntemi
Şimdide bu işlemleri kullanabileceğimiz değişkenlerimizi tanımlayalım ,
let evHayvanlari: Set = ["?", "?"] let ciftlikHayvanlari: Set = ["?", "?", "?", "?", "?"] let baskaHayvanlar: Set = ["?", "?"]
Değişkenlerimizi tanımladıktan sonra isSubset komutumuzu kullanalım ,
evHayvanlari.isSubset(of: ciftlikHayvanlari)
Derleyicimize kısaca evHayvanlari , ciftlikHayvanlari ‘nın bir alt kümesi midir ? diye sormuş olduk ve derleyicimizde evet cevabını verdi .
Şimdi ise isSuperset komutumuzu kullanalım ,
ciftlikHayvanlari.isSuperset(of: evHayvanlari)
Şimdi ise derleyicimize ciftlikHayvanlari , evHayvanlari ‘nı kapsar mı ? diye sorduk ve derleyicimizde doğal olarak true cevabını döndürdü .
Sırada ki komutumuz ise isDisjoint ,
ciftlikHayvanlari.isDisjoint(with: baskaHayvanlar)
Derleyicimize ciftlikHayvanlari ve baskaHayvanlar değişkenleri ayrık mı ? diye sorduk . Ve cevap olarak true cevabı döndü. Yani bu iki değişkenin ortak tek bir elemanı bile yokmuş.
Takıldığınız veya sormak istediğiniz soruları yorum kısmından belirtebilirsiniz.
Print(“Don’t be shy :)”)
16
eline saglik dostum
Çok teşekkürler
sets de neden ayrı veri olmaz acaba?, teşekkürler 🙂
Set, yani Türkçe’de küme. Anasınıfından beri öğrendiğimiz üzere bir küme bir elemandan ancak 1 tane içerebilir. Eğer aynı elemandan birden fazla eklemek istiyorsanız Array, Türkçe’de Dizi kullanabilirsin.
En son ev hayvanları örneğinde, devamındaki Set içerisindekiler komple “?” şeklinde. Bu aynı değer olmuyor mu?