Swift ve Sınıflar
Bu yazıda Nesneye Yönelik Programlama’nın temel kavramlarından biri olan sınıfların (classes) Swift dilinde nasıl kullanıldığından bahsedeceğim. Olabildiğince sade ve gerçek hayattan örnekler vererek açıkladığım bir yazı olacak, şimdiden keyifli okumalar.
Sınıf Nedir?
Sınıf, nesne yönelimli programlama dillerinde nesnelerin özelliklerini, davranışlarını ve başlangıç durumlarını tanımlamak için kullanılan şablonlara verilen addır.
Evet bu tanım biraz soyut olmuş olabilir, daha somut hale getirmek için gerçek hayattan örneklersek bu konunun daha net anlaşılacağını düşünüyorum.
Gerçek Hayatta Sınıflar
Sanayi Devrimi’nden önce İngiliz toplumu, nasıl bir ailede doğduğunuza bağlı olarak gruplara ayrılırdı ve bu da onların mesleğini, sosyal statüsünü ve siyasi etkisini etkilerdi. Üç temel sosyal sınıftan örnek verelim; üst sınıf (şirket sahipleri), orta sınıf (doktorlar, avukatlar), işçi sınıfı (fabrika işçileri).
1- Sınıflar somut bir tür değildir.
Sınıflar tek bir kişiyi temsil etmez. Örneğin Steve diye bir karakter hayal edelim, Steve bir kaç şirketin sahibi ve oldukça zengin bir birey, böylelikle üst sınıfa ait. Yani üst sınıf olarak adlandırdığımız sınıfta bulunan bir “kişi”.
Tek bir kişi oluşturmak istediğimizde, sınıfın bir örneğini(instance) yaratırız ve somut tip olan aslında bu örnektir.
2- Sınıflar somut tiplerin genlerini(properties & methods) belirler.
Genlerini belirler demek yeterince açıklayıcı oldu mu emin değilim, örnek vererek anlatalım. :)
Üst sınıf olarak adlandırdığımız sınıfın tahmin edersiniz ki her zaman parası vardır. Bu bağlamda zengin olmak üst sınıfın genlerinde vardır diyerek açıklayabiliriz diye düşünüyorum.
3- Sınıflar başlangıç değerlerini belirtir. (Initial Values)
Tekrar gerçek hayat örneğine dönecek olursak, tüm insanlar bir isme sahip olabileceği için, az sonra oluşturucağımız Person sınıfına başlangıç değeri olarak “ismi” ekleyebiliriz.
Swift’e uygulayalım!
Şimdi tüm bu gerçek hayat örneğini, Swift ile nasıl uygulayacağımıza bir bakalım.
Basit bir insan sınıfı oluşturalım.
Tüm sosyal sınıfların insanlardan oluştuğunu bildiğimiz için ortak bir insan sınıfı oluşturalım.
class Person {
var name: String
init (name: String) {
self.name = name
}
}
Gördüğünüz gibi, her insan bir isme sahip olduğu için başlangıç değeri olarak “name” değişkenini tanımladım. Şimdi ismi Steve olan bir “Person” _örneği (instance)_oluşturalım.
let steve = Person(name: “Steve”)
Kalıtım: İşçi sınıfından bir kişi oluşturalım.
Bu sosyal sınıfa ait olan kişinin fonksiyon olarak çok çalışması gerekiyor, o halde bu sınıfa ekstra bir işlev ekleyelim.
class WorkingClassPerson: Person {
func workHard() {
print ("Work hard!")
}
}
Jim adında ve işçi sınıfına ait bir örnek ekleyelim.
let Jim = WorkingClassPerson(name: “Jim”)
Oluşturduğumuz yeni sınıfta herhangi bir başlatıcı (initializer) olmamasına rağmen isim ekleyebildik. Peki bu nasıl oldu? Sorunun cevabı sınıfı oluşturduğumuz kod bloğunun ilk satırında saklı.
Bu sınıfı oluştururken “WorkingClassPerson: Person” yaparak Person sınıfının özelliklerini almasını ona söyledik. Böylelikle tekrar bir başlangıç değeri yazmamıza gerek kalmadı.
Oluşturduğumuz Jim kişisine ait şemayı aşağıdaki gibi çizebiliriz.
Miras: Üst sınıftan bir kişi oluşturalım.
Şimdi de Britanya topraklarında söz sahibi, zengin bir sınıf oluşturalım.
Elbette UpperClassPerson öğesi de bir Person olacak. Ayrıca üst sosyal sınıfa ait kişilerin parasının olduğunu ve bunu harcama özelliğine sahip olduğunu ekleyelim.
class UpperClassPerson: Person {
var money: Int
init(name: String, money: Int) {
self.money = money
super.init(name: name)
}
func spendMoney(amount: Int) {
money = money - amount
}
}
Phil, üst sosyal sınıfa ait bir birey ve bankasında 500 birim parası var.
let phil = UpperClassPerson(name: “Phil”, money: 500)
Burada Person sınıfından miras aldığı için, her insanda olan “isim” değerini tekrar tanımlamamıza gerek kalmamış oluyor. Bununla birlikte, mevcut parayı ekleyebilmek için yeni bir başlangıç değeri de eklememiz gerekiyor.
init(name: String, money: Int) {
self.money = money
super.init(name: name)
}
Ve yalnızca üst sosyal sınıfa ait olan özelliğimiz para harcama ile birlikte, kullanıcıdan harcadığı miktarı alıp, toplam parasından çıkartarak bir hesaplama yapar.
func spendMoney(amount: Int) {
money = money - amount
}
Phil’in son halini aşağıdaki diyagram ile daha iyi görebiliriz.
Oluşturduğumuz sınıfların farklı özellikleri olsa da temelde hepsinin bir insan sınıfı olduğunu hatırlamakta fayda var.
Ayrıca unutmadan söylemeliyim ki sınıflar, referans tipindedir. Ve en yakın kardeşi structs(yapılar) ile pek çok benzer ve farklı özelliklere sahiptir. Bu kavramlara da ilerleyen zamanda bahsetmeyi planlıyorum.
Kapanış
Swift dilinin temel kavramlarından biri olan sınıflar Swift dilini kullanırken de oldukça önem arz eder. Bu yazıda sizlere Swift dilinde sınıfları nasıl kullanacağımızdan bahsettim, umarım yararlı olmuştur! İlerleyen günlerde Swift ile alakalı yazacağım diğer yazılardan haberdar olmak için takip edebilirsiniz. ✨
Geri bildirim ve sorularınız için bana Twitter ya da hi@dogancan.dev mail adresinden ulaşabilirsiniz.
Referanslar: