Merhaba arkadaşlar ,
mobilhanem.com sitemiz için anlattığımız/yayınladığımız Swift Dersleri serimize bu yazımızda Swift Class ile devam edeceğiz. Bir önceki yazımızda Swift Optional 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.Class (Sınıf) Nedir ?
Class Nedir ?
Sınıflar nesneye ait özellikleri, fonksiyonları barındıran yapılardır. Daha genel tanımlıycak olursak nesne yönelimli programlamada, sınıflar, nesneler oluşturmak için başlangıç değerlerini ve davranışlarını belirleyen kod şablonlarıdır diyebiliriz.
Class Nasıl Oluşturulur ?
Araba isminde bir class oluşturalım ve swift dilinde class tanımlamasının yapısını görelim,
Class Araba { }
Class yapısını daha önceki miras alma dersinde bahsetmiştim. Şimdi Araba sınıfımızın değişkenlerini tanımlayalım,
Class Araba { var tekerlekSayisi: Int = 2 var arabaYasi: Int var maksimumKisiSayisi: Int }
Şeklinde sınıf içi değişkenlerimizi oluşturduk. Nesneleri oluştururken ilgili sınıfa ait ayarlamalar yapabilmeliyiz. Bunun içinde nesne oluşturulduğunda çağrılan Init methodumuzu kullanıyoruz. Bu method nesne yaratıldığında otomatik olarak çağrılmaktadır. Hemen init methodumuzu ekleyelim,
Class Araba { var tekerlekSayisi: Int = 2 var arabaYasi: Int var maksimumKisiSayisi: Int init(tekerlekSayisi: Int, arabaYasi: Int, maksimumKisiSayisi: Int){ self.tekerlekSayisi = tekerlekSayisi self.maksimumKisiSayisi = maksimumKisiSayisi self.arabaYasi = arabaYasi } }
Şeklinde init methodumuzu oluşturduk. Yukarıda karışıklığa yol açabilcek self.maksimumKisiSayisi = maksimumKisiSayisi satırını hemen açıklayayım. self keyword ‘ü ile class değişkenimiz olan maksimumKisiSayisi değişkenimizi belirtmiş oluyoruz. Eşitliğin sağ tarafında olan maksimumKisiSayisi, yani atanan değer ise init methoduna parametre olarak verilen değerdir. self keyword ‘ü ile bunun ayrımını gerçekleştiriyoruz. Aynı ayrımı tekerlekSayisi ve arabaYasi değişkenleri içinde yapmış olduk.
Birden Fazla Init Methodu
Class ‘larımıza birden fazla init methodu ekleyebiliriz. tekerlekSayisi isimli değişkenimizin bir ilk değeri vardır. Init methodumuzda tekelrlekSayisi ‘ni parametre olarak almazsak otomatik olarak değişkenimizi tanımlarken ki verdiğimiz ilk değeri otomatik olarak atar,
class Araba { var tekerlekSayisi: Int = 2 var arabaYasi: Int var maksimumKisiSayisi: Int init(tekerlekSayisi: Int, arabaYasi: Int, maksimumKisiSayisi: Int){ self.tekerlekSayisi = tekerlekSayisi self.maksimumKisiSayisi = maksimumKisiSayisi self.arabaYasi = arabaYasi } init(arabaYasi: Int, maksimumKisiSayisi: Int){ self.maksimumKisiSayisi = maksimumKisiSayisi self.arabaYasi = arabaYasi } }
En son eklediğimiz init methodumuz tekerlekSayisi ‘ni parametre olarak almamaktadır ve tanımlarken atadığımız ilk değerimizi almaktadır. Şimdi Bu oluşturduğumuz class ‘ımızdan bir instance türetelim ve yaptıklarımızın ne işe yaradığını somut olarak görelim,
İlk olarak bir binek araba üretelim, kapasitesi 5 kişi, tekerlek sayısı 4 ve arabanın yaşıda 5 olsun,
var binekAraba = Araba(tekerlekSayisi: 4, arabaYasi: 5, maksimumKisiSayisi: 5)
Şeklinde arabamızı türettik. Bu işlemi yaparken Araba class ‘ının init methodunu kullandık. Şimdide bu binekAraba nesnemizin tekerlekSayisi, arabaYasi ve maksimumKisiSayisi değerlerine erişelim ve ekrana bastıralım,
print(binekAraba.tekerlekSayisi) print(binekAraba.arabaYasi) print(binekAraba.maksimumKisiSayisi)
Şeklinde init methodumuza parametre olarak verdiğimiz değerlerin binekAraba nesnesi oluşturulurken kullanıldığını görmüş olduk. İlk olarak türettiğimiz nesnenin ismini yani binekAraba ardından ise türettiğimiz sınıfın değişkenlerinin isimlerini yani tekerlekSayisi, arabaYasi, maksimumKisiSayisi yazarak eriştik. Şimdide arabamızı türettik fakat aradan tam 1 yıl geçti arabamızın yaşıda 1 artttı demektir. Hemen bu senaryoyu gerçekleştirelim ve arabaYasi değişkenimizin değerini güncelleyelim,
binekAraba.arabaYasi += 1
Diyerek kolaylıkla binekAraba instance ‘ımızın arabaYasi değerini 1 artırmış olduk. Burada yaptığımız += ifadesi => binekAraba.arabaYasi = binekAraba.arabaYasi + 1 ifadesinin kısa yazılmış halidir. Şimdi bu yaptığımız işlemi Araba class ‘ımıza bir fonksiyon ekleyerek daha güzel hale getirelim,
class Araba { var tekerlekSayisi: Int = 2 var arabaYasi: Int var maksimumKisiSayisi: Int init(tekerlekSayisi: Int, arabaYasi: Int, maksimumKisiSayisi: Int){ self.tekerlekSayisi = tekerlekSayisi self.maksimumKisiSayisi = maksimumKisiSayisi self.arabaYasi = arabaYasi } init(arabaYasi: Int, maksimumKisiSayisi: Int){ self.maksimumKisiSayisi = maksimumKisiSayisi self.arabaYasi = arabaYasi } func arabaYasiniArttir(eklenecekYil: Int){ self.arabaYasi += eklenecekYil } }
Yukarıda gördüğünüz gibi arabaYasiniArttir isimli fonksiyonumuzu class ‘ımıza ekledik. Bu fonksiyonumuz Int tipinde eklenecekYil isminde bir değer almaktadır. Fonksiyonumuza parametre olarak verilen bu değeri class ‘ımızın arabaYasina += yardımı ile ekliyoruz.
Evet şimdide sonradan eklediğimiz init methodumuzu kullanarak bir motorsiklet türetelim,
var motorsiklet = Araba(arabaYasi: 3, maksimumKisiSayisi: 2)
Şeklinde motorsiklet instance ‘ımızı türettik. Yukarıdaki binekAraba nesnesinin türetilişinden farklı olarak burada sonradan eklediğimiz init methodunu kullanarak gerçekleştirdik ve tekerSayisi değişkenimize parametre olarak bir değer ataması yapmadık. motorsiklet instance ‘ımızın sahip olduğu değerleri ekranımızda gösterelim,
print(motorsiklet.tekerlekSayisi) print(motorsiklet.arabaYasi) print(motorsiklet.maksimumKisiSayisi)
Komutlarını kullanarak ekranımıza bastırdık ve sırasıyla ,
- 2
- 3
- 2
Değerlerini gördük. Fakat biz tekerlekSayisi olarak fonksiyonumuza bir değer vermemiştik bu değeri nereden aldı ? tekerlekSayisi değişkenimizi oluştururken ilk değer ataması yaparak 2 değerini vermiştik. Init methodumuzda değişkenimizi değerini değiştirmediğimiz içinde ilk atadığımız değer değişmemiş oldu ve o değeri ekrana bastırmış oldu.
Polymorphism Ve Inheritance
Inheritance daha önceki derslerde anlattığım gibi miras alma işlemine verilen isimdir.
Peki Polymorphism nedir ? Türkçesi çok biçimcilik diye geçmektedir. Örneğin Miras aldığımız sınıfımızda buluna bir fonksiyon var ve biz bu fonksiyonumuzu miras aldığımız class ‘ımızda değiştiriyoruz. Hemen devam edelim
Evet şimdide Araba sınıfımızdan miras alan iki farklı sınıf oluşturalım,
Ama ilk önce Araba sınfıımıza, bir fonksiyon ekleyelim bu fonksiyonda korna çalındığını farzedelim. Bildiğimiz gibi her arabanın korna sesi farklıdır,
class Araba { var tekerlekSayisi: Int = 2 var arabaYasi: Int var maksimumKisiSayisi: Int init(tekerlekSayisi: Int, arabaYasi: Int, maksimumKisiSayisi: Int){ self.tekerlekSayisi = tekerlekSayisi self.maksimumKisiSayisi = maksimumKisiSayisi self.arabaYasi = arabaYasi } init(arabaYasi: Int, maksimumKisiSayisi: Int){ self.maksimumKisiSayisi = maksimumKisiSayisi self.arabaYasi = arabaYasi } func arabaYasiniArttir(eklenecekYil: Int){ self.arabaYasi += eklenecekYil } func kornaCal(){ print("Korna Çalıncak") } }
Korna çalınacak olan fonksiyonumuzu ekledikten sonra ki class ‘ımızın son hali yukarıdaki gibi olacaktır. Hemen Araba class ‘ımızdan miras alan iki adet sınıf türetelim,
class Otobus: Araba { } class Kamyon: Araba { }
Otobus ve Kamyon Sınıflarımızı oluşturduk bu sınıflarımız daha önceden oluşturduğumuz Araba sınıfımızdan miras almışlardır.
Peki bu ne demektir ?
Araba sınıfına ait olan değişkenleri ve fonksiyonları bu sınıf içerisindede kullanabiliriz. Evet o zaman kornaCal fonksiyonumuzu bu sınıflar içerisinde kullanalım,
class Otobus: Araba { override func kornaCal() { print("Daaaaaaaaaaaaaat") } } class Kamyon: Araba { override func kornaCal() { print("Dat diri dat dat dat diri dat dat daaaaat") } }
Ve Otobus sınıfımızdan bir instance türetelim türeteceğimiz bu instance Araba sınıfının init methodları kullanılarak üretilecektir,
var halkOtobusu = Otobus(tekerlekSayisi: 10, arabaYasi: 14, maksimumKisiSayisi: 130)
Şeklinde parametrelerimizin değerlerini vererek halkOtobusu instance ‘ımızı oluşturduk. Yukarıda yaptığım şeklide bu instance ‘ın değerlerini ekrana bastırabilirsiniz.
Biraz önce Otobus sınıfımızda kornaCal Fonksiyonumuzu yeniden yazmıştık override etmiştik bakalım yapabilmiş miyiz ?
halkOtobusu.kornaCal()
Ekranda ne gördünüz ? İşe yaramış mı ?
Aynı işlemleri Kamyon sınıfından bir nesne türeterek kendiniz yapabilirsiniz.
Paremetre Almayan Init Methodu
Bu methodu yapabilmemiz için değişkenlerimizi optional olarak değilde ilk değer ataması yaparak oluşturmamız gerekmektedir. Farkın daha iyi anlaşımlası açısından yukarıda oluşturduğumuz Araba sınıfımızı uyarlayalım,
class Araba { var tekerlekSayisi: Int = 2 var arabaYasi: Int = 1 var maksimumKisiSayisi: Int = 4 }
Şeklinde Optional olmayan ilk değer ataması yapılmış olan değişkenlerimizi tanımladık. Şimdi ise init methodumuzu yazalım,
init(){ }
Evet parametre almayan init methodumuzu yazdık. Şimdi Araba sınıfımızdan bir instance türetelim,
var yarisArabasi = Araba()
Evet şimdi ise değerlerimizi konsola bastıralım,
print(yarisArabasi.tekerlekSayisi) print(yarisArabasi.arabaYasi) print(yarisArabasi.maksimumKisiSayisi)
Şeklinde daha önceden de yaptığım gibi aynı şekilde değerlerimize eriştik. Çıktımız ise ,
- 2
- 1
- 4
Bu değerler ilk değer atamamızda verdiğimiz değerlerdir. Şimdide bu değerlerimizi değiştirelim ve yarış arabası özelliklerini verelim,
yarisArabasi.tekerlekSayisi = 4 yarisArabasi.arabaYasi = 0 yarisArabasi.maksimumKisiSayisi = 1
Şeklinde değerlerimizi değiştirdik ve tekrardan ekran bastırarak kontrol edelim ,
print(yarisArabasi.tekerlekSayisi) print(yarisArabasi.arabaYasi) print(yarisArabasi.maksimumKisiSayisi)
Çıktımız ,
- 4
- 0
- 1
Şeklinde olacaktır.
Son olarakta Kare isimli bir Dikdörtgen isimli bir sınıf oluşturalım ve bu sınıftan bir instance türetip alan ve cevresini bulalım,
class Dikdortgen { var kisaKenar: Int = 0 var uzunKenar: Int = 0 init(kisaKenar: Int, uzunKenar: Int){ self.kisaKenar = kisaKenar self.uzunKenar = uzunKenar } init(){ } func alanHesapla() -> Int{ return kisaKenar * uzunKenar } func cevreHesapla() -> Int{ return 2 * (kisaKenar + uzunKenar) } }
Şeklinde Dikdortgen isimli class ‘ımızı oluşturduk ve bu class ‘Imızın iki adet değişkeni mevcuttur bunlar kisaKenar ve uzunKenar isimli değişkenlerimizdir. Ilk değer ataması yapılarak 0 değeri atadık. Ardından parametre alan init methodumuzu oluşturduk. Sonra ise alanHesapla fonksiyonumuzu ve cevreHesapla fonksiyonumuz oluşturduk . Bu fonksiyonların içerisinde class ‘ımızın değişkenlerini kullandık ve gerekli hesaplamarı yapıp geriye hesapladığımız değerleri dondurduk. Burada birde parametre almayan init methodumuzu oluşturduk şimdi bu iki init methodumuzu kullanarak instance larımızı türetelim,
var kare = Dikdortgen(kisaKenar: 10, uzunKenar: 10)
kare isimli instance ‘ımızı oluşturduk. Oluştururken paremetre olarak 10 ve 10 değerlerini kisaKenar ve uzunKenar olarak verdik bu yüzden parametre alan init methodumuzu kullanarak instance ‘ımızı oluşturmuş olduk. Hemen alan ve cevreyi hesaplayan ve geriye değer döndüren fonksiyonlarımızı kullanalım,
print(kare.alanHesapla()) print(kare.cevreHesapla())
Şeklinde ekrana bastırmış olduk. Instance_ismi (kare) . Fonksiyon_ismi (alanHesapla) şeklinde fonksiyonumuza eriştik ve geriye değer döndürmesini sağladık,
var rastgeleDikdortgen = Dikdortgen()
rastgeleDikdortgen isimli instance ‘Imızı oluşturduk ve parametre olarak bir değer vermedik bu yüzden instance ‘Imız oluşturulurken parametre almayan init methodumuz ile oluşturuldu ve class değişkenlerimizin ilk değerleri kullanıldı. Bunu alan ve cevreyi hesaplatarak görebiliriz ,
print(rastgeleDikdortgen.cevreHesapla()) print(rastgeleDikdortgen.alanHesapla())
Evet çıktılarımız 0 oldu ve ilk değer atamasında verdiğimiz değerlerin kullanıldığını gördük.
rastgeleDikdortgen.kisaKenar = 13 rastgeleDikdortgen.uzunKenar = 32
Şimdi ise instance ‘ımızı kendimize göre şekillendirdik. Şimdi alan ve cevreyi hesaplayalım (hesaplama yine aynı şekilde olacaktır) ve çıktımızı görelim ,
- 90
- 416
Çıktılarını gördük.
Bir dersin daha sonuna geldik bir sonraki derste görüşmek üzere ? ?
let steveJobsQuote = “Don’t let the noise of other’s opinions drown out your own inner voice…”
print(steveJobsQuote)
16