Merhaba arkadaşlar ,
mobilhanem.com sitemiz için anlattığımız/yayınladığımız Swift Dersleri serimize bu yazımızda Swift Stack Kullanımı ile devam edeceğiz. Bir önceki yazımızda Swift Dictionary 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 Stack Nedir ?
Stack kelime karşılığı olarak yığın demektir. Swift Stack yapısı Array yapısına çok benzer. Fakat Array ‘lerden çok daha kısıtlıdır. Stack içerisinde sıralı değerler tutabilmemizi sağlar. Bu tuttuğumuz değerlerin üzerine yeni bir değer ekleyebilir veya çıkartabiliriz. SwifStack yapısını , ekleme ve çıkarma işlemlerini aşağıdaki görsel ile daha iyi anlayabilirsiniz. Pop eleman ekleme , pop ise elemanı çıkarma işlemlerini yapmaktadır.
Şekillerde görüldüğü gibi push fonksiyonu ile stack ‘e yeni eleman ekleyebilirken , pop ile de stack yapısından eleman çıkarabilmekteyiz. Şimdi de push ve pop fonksiyonlarına ayrıntılı bakalım.
Swift Push Fonksiyonu
Stack ‘lere eklenen elemanlar her zaman sıralı olarak tutulmaktadır. Stack ‘e bir eleman eklediğinizde o eleman en alt sıraya oturur ve Stack ‘in ilk elemanı o olur. Onun üzerine bir eleman daha eklerseniz ilk eklediğinizin üzerine gelir ve Stack ‘in ilk elemanı sonradan eklediğiniz olur. Yani en son eklediğiniz eleman her zaman en üst sırada olur.
Swift Pop Fonksiyonu
Stack ‘lerde pop işlemini uyguladığınızda input olarak bir değer belirtemezsiniz. Otomatik olarak pop işlemi o an Stack ‘in Top elemanını yani en üstte olan başka bir deyişle en son eklenen elemanı Stack ‘ten dışarıya çıkartır.
Swift Stack Oluşturma
Swift dilinde Stack oluşturmak için Struct kullanabiliriz. Struct yerine aynı işi Class oluşturarakta yapabiliriz.
İlk olarak Struct yapımızı oluşturalım,
struct Stack<T> { }
Stack isimli Struct ‘ımızı oluşturduk. Burada <T> yazmamızın sebebi oluşturduğumuz Stack yapısı bütün veri tiplerini desteklemesi içindir. Stack yapısını oluştururken Array ‘lerdende faydalanacağız. Şimdide Struct ‘ımıza kullanacağımız Array ‘imizi tanımlayalım. Bu Array ‘i tanımlamamızın sebebi pop ve push işlemlerinde elemanlarımızı ekleyeceğimiz veya çıkaracağımız yer olarak kullanıcak olmamızdır.
struct Stack<T> { var degerler = [T]() }
Değerleri T türünde olan boş bir array yarattık . Tekrardan bir hatırlatma yapmak iyi olacaktır. Burada ki T ileride oluşturacağımız Stack ‘in farklı tiplerde oluşturulmasını sağlayacaktır. Örneğin isimlerden(string) oluşan bir stack veya yaşlardan(Int) oluşan bir stack yapısını kullanabileceğiz. Eğer buraya belirli bir tip girmiş olsaydık mesela string gibi o zaman yaşlardan oluşan bir stack yapısını oluşturamayacaktık. Şimdi de Stack ‘in en üstteki(top) elemanını başka bir deyişle en son eklenen elemanı bulmak için gerekli işlemleri yapalım .
struct Stack<T> { var degerler = [T]() var enUsttekiDeger: T? { return degerler.isEmpty ? nil : degerler[degerler.count - 1] } }
Az önce ne oldu diye düşünebilirsiniz . Korkulacak bir şey yok 🙂
Yukarıda yaptığımız işlem swift dilinde mevcut olan Property ‘lerden birini kullandık. Property ‘ler 2 adettir.
- Stored Property
- Computed Property
Stored Property , class ‘lar ve structure ‘lar (struct) tarafından desteklenirken Computed Property ise class ‘lar, structure ‘lar, and enumeration ‘lar tarafından desteklenmektedir.
Bizim yukarıda kullandığımız ise Computed Property ‘dir. Yani hesaplanmış özellik anlamındadır. Peki tam olarak enUsttekiDeger değişkeni nasıl hesaplanacak ?
Hemen anlatıyım ,
ilk olarak degerler.isEmpty ile degerler isimli dizinin boş olup olmadığının kontrolü yapılacaktır.
Eğer dizi boş ise geriye nil değeri döndürülecektir.
Eğer dizi boş değil ise degerler dizisinin deger.count – 1 . index ‘inde bulunan eleman döndürülecektir. o index ‘te bulunan elemanda zaten en üstte bulunan eleman olacaktır.(Top)
return Koşul ? True ise döndürülecek değer : False ise döndürülecek değer
Yapısında kısaca şekilde yazmış oldum .
Şimdi de Struct ‘ımıza pop ve push işlemlerini yapabilecek fonksiyonlarımızı ekleyelim. Başlamadan önce, struct kullandığımız için yazdığımız fonksiyonların başına mutating keyword ‘ünü eklemek zorundayız. Eğer Struct yerine Class oluşturmuş olsaydık böyle bir zorunluluğumuz olmayacaktı.
struct Stack<T> { var degerler = [T]() var enUsttekiDeger: T? { return degerler.isEmpty ? nil : degerler[degerler.count - 1] } mutating func push(_ deger: T) { degerler.append(deger) } mutating func pop() -> T { return degerler.removeLast() } }
push isimli fonksiyonumuz paremetre olarak T yani her türlü değişken tipini(Int,String,Float,Double ..) alabilmektedir. Ve aldığı parametre değerine deger ismini verdik. Ve fonksiyona verilen değeri yani deger ‘i degerler isimli array ‘imize append methoduyla ekledik. push , input olarak aldığı değeri degerler isimli array ‘e eklemektedir.
Ardından pop isimli fonksiyonumuzu oluşturduk. pop , push fonksiyonu gibi input almayacak onun aksine geriye bir değer döndürecektir. Döndüreceği bu değerin türünü T olarak belirttik. Ve fonksiyonumuzun içerisinde degerler isimli array ‘in en son elemanını dizinden .removeLast methoduyla çıkardık ve dizinin kalan kısmını return keyword’ü ile geriye döndürdük.
pop , degerler array ‘inden en son eklenmiş olanı bir başka deyişle en son push edilmiş olan elemanı diziden çıkartarak geriye döndürür. Şimdide yaptığımız işlemleri deneyelim 🙂
var selamlama = Stack<String>()
selamlama isminde türü Stack ve değerleri String olan bir değişkenimizi oluşturduk. Şimdi de selamlama isimli Stack yapımıza push ile eleman ekleyelim.
selamlama.push("Merhaba") selamlama.push("Benim") selamlama.push("Adım") selamlama.push("Taha")
Evet yukarıda ki şekilde açıkladığım aynı örnek değerlerini stack ‘imize push ettim . Burada dikkatinizi çekmek istediğim şey ise oluşturduğumuz selamlama Stack ‘i sadece string türünde değerler alabilmektedir. Bu yüzden ,
selamlama.push(22)
Gibi bir işlem hata ile sonlanacaktır. Çünkü push ettiğimiz değer string türünde değildir (Int)
Push işlemininden sonra şimdide pop işlemine biraz göz atalım.
selamlama.pop()
Şeklinde selamlama stack ‘imize son eklenen elemanı pop edebilirsiniz yani çıkarabilirsiniz. Eğer pop ettiğiniz elemanın ne olduğunu bilmek istiyorsanız ,
let popEdilenDeger = selamlama.pop()
Şeklinde başka bir değişkene atayabilir ve ardından dilediğiniz kontrolü veya işlemleri popEdilenDeger değişkeni üzerinden gerçekleştirebilirsiniz.
Şimdi ise stack ‘imizin en üstünde olan elamanı bulalım ,
if let enUsttekiEleman = selamlama.enUsttekiDeger { print("Stack 'in en üstündeki eleman -> \(enUsttekiEleman)") }
Şeklinde stack ‘e en son eklenen elemanı yani en üstte bulunan elamanı bulabiliriz. Daha henüz anlatmamış olmama rağmen baya aşina olduğunuz if let yapısını tekrardan burada kullanmış oldum . Burada kullanma sebebim ise stack ‘imizin boş olma ihtimalide vardır bu durumu göz önünde bulundurursak en üstte bir eleman olmayacağından dolayı uygulamamızın hata vermemesi için eğer öyle bir eleman var ise print komutunu çalıştır. Yok ise hiç bir şey yapma dedik ve if let yapısını buradada kullandık 🙂
Şimdi de Int türünde değerler alabilen başka bir Stack yapısı tanımlayalım,
var yaslar = Stack<Int>()
Ardından stack yapımıza değerlerimizi push edelim ,
yaslar.push(24) yaslar.push(25) yaslar.push(26) yaslar.push(27)
yaslar isimli Stack ‘imizde şu an görünüm şu şekildedir,
Ve şimdi ilk pop işlemimizi yapalım ,
yaslar.pop()
Yukarıdaki işlemi yaptıktan sonra Stack ‘imizde olan işlem aşağıdaki gibidir ,
Bu satır çalıştırıldıktan sonra yaslar Stack ‘imizin son hali aşağıdaki gibidir ,
Şekildede gördüğünüz gibi ilk pop işleminde en son eklenen değer yani 27 değeri çıkarılmıştır. Son olarak bir kez daha pop işlemi uygulayalım ve sonucunu görelim ,
yaslar.pop()
Bu satır çalıştırıldıktan sonra yaslar Stack ‘imizin son hali aşağıdaki gibidir ,
Eğer stack içerisinde bulunan eleman sayısından daha fazla pop işlemi yaparsanız hata ile karşılaşırsınız. Peki bu hatayı nasıl giderebiliriz ? Bunun çözümünü bir sonraki derste yani Swift Queue Kullanımı dersinde göstereceğim.
Böylelikle Swift Stack Kullanımı dersimizin sonuna geldik. Aklınıza takılan soruları yorum kısmından yazabilirsiniz.
print(“If debugging is the process of removing software bugs, then programming must be the process of putting them in”)
print(“Edsger Dijkstra“)
3
[…] Tümünü Göster Swift Stack Kullanımı […]
Yukarıda Swift Stack Kullanımı konusunda,
“Pop eleman ekleme , pop ise elemanı çıkarma işlemlerini yapmaktadır.”
Yazılmış bir hata var sanırım.