Gün geçtikçe insanların isteklerine göre teknolojiler, buna bağlı olarak bu teknolojilere uygun yazım dilleri de gelişiyor. Gelişen her yazılım dili temel olarak programcının hızlı ve kolay bir şekilde programlama yapabilmesini amaçlıyor. Nesne yönelimli programlamada bu amaç doğrultusunda oluşturulan bir programlama biçimi. Peki bu Swift ile nesne yönelimli bir programlama nasıl yapılır gelin biraz yakından bakalım.
Swift ile Sınıf Kullanımı
Sınıflar nesne yönelimli programlamanın yapı taşıdır. Yapılmak istenen programın bize şemasını ortaya çıkarır. Sınıflar özelliklerden, metotlardan ve events denilen Türkçeye olaylar olarak çevirebileceğimiz parçalardan oluşur. Bu üç parçanın birleşmesi ile bir sınıf ve bu sınıftan oluşturulan bir obje ile birbirinden farklı projeler oluşturmak mümkün olur. Swift ile bir sınıf şu şekilde oluşturulur;
Class sınıf_adı {
Özellikler,
Metotlar,
Olaylar,
}
Oluşturulan sınıfı kullanmak için bu sınıftan bir obje oluşturmamız gerektiğini söylemiştik. Bunu ise şu şekilde yapıyoruz;
let obje_adı = Sınıf_adı()
Artık belirlediğimiz objenin adını yazıp nokta koyarsak sınıf içerisinde belirlenen nicelikleri buradan ulaşıp değiştirebilmemiz mümkün. Sınıf oluştururken dikkat ederseniz özelliklere hazır bir değer atadık. Çünkü bunu atamazsak bizlere program bir hata veriyor. Bu hataya yakından bakarsak bize initializer kullanmadığımızı söylüyor. Peki nedir bu initializer ? Başka dillerde constructor (yapıcı blok) olarak geçen bu yapı, Swift içinde initializer olarak kullanılır. init() fonksiyonu ile kullanılan bu yapı, sınıf içerisindeki özelliklerden ve metotlardan bağımsız her obje oluşturulduğunda çalıştırılır. Bu yüzden oluşturduğumuz özelliklere bir değer atamadan init() fonksiyonunu kullanarak obje oluşturulduğu sırada özellikleri kendimiz belirleyebiliriz.
Class sınıf_adı {
var a : String
var b : Int
var c : String
init ( a : String, b : Int, c : String) {
self.a = a
self.b = b
self.c = c
}
}
Şeklinde oluştururuz. Şimdi obje oluşturmak istersek;
let obje_adı = Sınıf_adı{a : “ test“ , b : 0, c : “test”}
Şeklinde bir obje oluşturmuş oluruz. Bu sayede daha anlaşılır, kullanılabilir ve kişiselleştirilmiş bir yapı elde ederiz.
Enum Yapısı
Enumerated Type olarak kullanılan enum, aslında daha çok kategorize etmek istediğimiz durumlarda kullanılır. Yapısal olarak incelediğimizde;
enum kategori_adı {
case kategori_türü
.
.
.
}
Şeklinde oluşturulur. Bu yapıyı kolayca sınıfımıza ekleyebilir ve init içerisine alarak kullanıcının obje belirlerken buradan bir seçim yapmasını sağlayabiliriz. Örneğin;
Enum test_enum {
case a
case b
}
Class test{
var a : String
var b : Int
var c : String
var d : test_enum
init ( a : String, b : Int, c : String, d : test_enum) {
self.a = a
self.b = b
self.c = c
self.d = d
}
}
Şimdi bir obje oluşturursak;
let test_obje = test{a : “ test“ , b : 0, c : “test”, d : test_enum.a}
Görüldüğü gibi kullanıcı objesinin kategorisini de seçebildi.
Kalıtım (Inheritance)
Bir bebek doğduğunda birçok özelliğini aile üyelerine benzetiriz. Fakat ne kadar benzese de o yine de farklı bir bireydir. Yani temel özelliklerini ailesinden almış fakat kimi zaman temel özelliğin üzerine farklı bir özellik eklemiş veya ailesine benzemeyen farklı bir özelliği mevcuttur. İşte bu durum aslında programlama içinde geçerlidir. Yani oluşturduğumuz yeni sınıfın, temel sınıfın özelliklerini kullanmasına kalıtım denir. Bu yapı şöyle oluşturulur;
Class temel {
Var a : String
Var b : Int
init (a : String, b : Int) {
self.a = a
self.b = b
}
func test() {
print(“test”)
}
}
Class türetilmiş : temel {
func test2 () {
Print(“test2”)
}
}
Görüldüğü gibi : kullanarak türetilmiş adındaki sınıfın temel sınıftan kalıtım almasını sağladık. Bu sayede hem temel sınıftaki özellikleri kullanabilir hem de test2 metodunu kullanabiliriz. Eğer test metoduna bir şeyler eklemek istersek override kelimesini kullanarak türetilmiş adlı sınıfın içinde kullanabiliriz. Ayrıca super kelimesini de kullanarak atadan gelen özelliği bu metoda ekleyebiliriz. Bu sayede türetilmiş sınıfından obje oluşturan biri test metodunu çalıştırdığında hem temel sınıftaki hem de türetilmiş sınıftaki fonksiyonları görebilecek.
Class türetilmiş : temel {
override func test () {
super.test()
Print(“test2”)
}
}
let türetilmiş_obje = türetilmiş()
print(türetilmiş_obje.test)
ÇIKTI
test test2
Erişilebilirlik Seviyeleri
Swift içerisinde 5 adet erişilebilirlik seviyesi bulunur. Bunlar;
1) Open
Bu seviye her yerden ve herkes tarafından erişilebilir ve içeriği değiştirilebilir anlamına gelir.
2) Public
Bu seviye de her yerden ve herkes tarafından erişilebilirliği temsil ederken tek farkı içeriği değiştirilemez. Sadece kullanılabilir.
3) Internal
Bu seviye aslında bize Swift tarafından sunulan hazır değerdir.
4) FilePrivate
Bu seviye sadece oluşturulan sınıf veya bu sınıfın içinde bulunduğu dosyadan erişim sağlanabildiğini temsil eder.
5) Private
Bu seviye artık en güvenli seviyedir. Sadece oluşturulan sınıf içerisinde kullanıma izin verir. Başka herhangi bir yerden veya herhangi bir kişi erişim sağlayamaz. Ayrıca içeriği değiştiremez anlamına gelir.
Göründüğü gibi nesne yönelimli programlama bizlere birçok avantaj sağlamakta. Bu yapıların iyi anlaşılması ve doğru uygulanması program ve programcılar için büyük bir önem arz etmekte. Peki sizce de söylendiği kadar önemli ve kullanışlı mı?