Swift 5.3 OOP 1 (Class And Struct,Access Control,Static)

Artık bazı şeyleri uygulama üstünden öğrenme vakti geldi.Öncelikle nesne kavramına girmeden bazı şeylere hakim olmak gerekiyor.

OOP yapısında Class’lar üzerinde ki özelliklere yani değişkenlere veya fonksiyonlara erişmek için nesne yapısını kullanırız.Tabi ki bu özelliklere nesne olmadan da erişmek mümkündür.Lakin ki öyle değildir 🙂 Yani Nesne yönelimli programalama bir felsefedir.Biz tıpkı Java’da olduğu gibi Swift dili üzerinde de bu yapıya hakim olmak zorundayız.Şimdi bu özelliklerden bahsettik ama bu özellikler nerede barındırılıyor ? Bu özellikler Class’lar içersinde barındırılıyor.Swift dilinde bir de baş belası olan yeni Struct diye bir yapı var.Bu Struct yapısı da tıpkı Class’lar gibi çalışır.Lakin buna geçmeden önce Class mantığını iyice kavramamız gerekir.O yüzden bu yapıya daha sonra değineceğiz.Class herhangi bir şeyin soyut olarak özelliklerin ve çalışma sistemini tanımlarŞimdi Bir Class tanımlayalım.

  • Bisiklet İsimli bir Class Tanımladım.
  • Bisiklete ait olan temel özellikleri değişken şeklinde tanımladım.
  • Bisikletimin tüm özelliklerini toplayan ve bana çıktı veren bir Fonksiyon Ürettim.

Nesne Kavramı

Nesne yöntemli programlama dillerinde nesneler kullanım itibari ile bir Class’ı referans göstererek var olurlar.Bir Class’tan nesne oluşturma işlemine örnekleme denir.İşte bu örneklendirme işini ancak hafızada yer alarak yapabilirler.Hafızada yer alması için ise nesneyi tanımlamak şarttır.Her nesne kendi verilerini içinde saklar ve dışardan erişime izin vermeyebilir.Bir Class’ın birden fazla nesnesi olabilir.Nesneler somut kavramdır .Class’lar gibi soyut değildir.Java da hatırladığımız new komutu Swift dilinde kullanmıyoruz.Nesneyi tanımlarken let veya var olarak tıpkı bir değişken gibi tanımlarım Ardından bir isim verip atama işlemi ile ilgili Class’ı referans ediyorum.

  • Sabit değişken olarak nesnemi tanımladım.
  • Ardından Nesnem üzerinden gerekli özelliklere veri atadım.
  • Fonksiyonum ile eklediğim özellikleri Return Edip Çıktı Aldım.

Static Kavramı (Ya Nesne Olmasaydı?)

Özetle şunu diyelim eğer nesne olmasaydı doğru dürüst verimli olarak programlar göremezdik 🙂 Tabi ki adamlar bunu düşünmüş nesne kullanmaya gerek duymadığımız bazı özeli noktalarda kullanmak için static diye bir deyim eklemişler.Değişken fonksiyonarl vs. hepsi static özelli kanadırabilir.Lakin bunu çok özel durumlar çok hafif işlemlerde kullanmanızı tavsiye ederim.

  • Öğrenci sınıfında 2 adet değişken bulunuyor.
  • Nesne olmadan erişmek istiyorsak static etikini eklemem gerek.
  • Artık Sınıf ismini çağırdığım zaman direk olarak erişebildim.
  • Fonksiyonlar için de aynı mantık geçerli.

Accèss Control Kavramı (Erişim Belirteçleri)

Şimdi tam bu noktada bir virgül koymak gerekiyor 🙂 Java’da aşina olduğumuz public private vs.. gibi kavramlar Swift dilinde de mevcut.Bir sınıfın bir değişkenin veya bir fonksiyonun hangi şekiller de erişilebilir olduğunu tanımlamak oldukça önemlidir.Eğer gerçekten gerekmiyorsa bir özellik public yapmanın mantısı yoktur.Olabildiğince güvenlik amaçlı diğer Sınıflardan veya durumlardan sakınmak için Access Kontrol ile işlem gerçekleştirmeliyiz.

Temel Olarak 5 Adet Access Yapısı Var

  • Open:Aynı Paket içinde ki sınıflar Erişebilir.
  • Public:Aynı paket içnde ki sınıflardan Erişebilir.Open özelliğinden farkı Ne? Şöyle bir fark var :Open Access ile farklı modüller üzerinde Override işlemi gerçekleştirebilirken , Public Access ler Override edilemezler.
  • İnternal:Default olarak gelir .Public’e göre daha kısıtlıdır.Publicte farklı modüllere erişebilirim fakat Overrid’de edemiyorduk.İnternal Access’te ise farklı bir modülden erişemeyiz.Sadece var olduğumuz paket içinde ki işlemler yapmamıza olanak verir.
  • FilePrivate:Sadece tanımladığı dosya içinden erişim sağlanır.Mesela Fileprivate olarak Main.Swift dosyasında bir sınıf tanımladım.Aynı paket içinde Anil.Swift diye bir dosya oluşturdum.İşte Anil dosyasından erişim sağlayamam.
  • Private:Tam bir özel güvenlik yöntemi 🙂 En üst seviye koruma budur.Eğer bir değişkeni veya fonksiyonu Private yaptıysak sadece o sınıfın içinden erişim vardır.

Evet şimdi bir Class,değişken,fonksiyon ,Struct tanımlarken eğer biz özel olarak bir Access Kontrol Belirtmediysek eğer default olarak İnternal Access özelliğine sahip olur.Derleyici size bunu belirtmez lakin default olarak bu şekilde bellekte doğmaktadır.Access Control’de her zaman şöyle bir güvenlik kuralı vardır.

Bir Sınıf,Struct,Değişken,Fonksiyon tanımlanırken sahip olduğu Access Kontrol denetimin altında olan bir güvenlik sistemine geçemez.örnek vermek gerekirse FilePrivate olarak tanımlanan bir sınıfın içinde bir özelliğe Public Access atayamayız.Çünkü FilePrivate göre daha çok erişimi kapsar.Çinkü Sınıf Fileprivate olarak tanımlanmıştır.Alt seviyede işlem yaptırmaz.Yani Access Kontrol erişimini tanımladıktan ona düşüremeyiz sadece daha güvenli bir Access Kontrole geçiş yaptırabilirim.

Örnek:

  • Aşağıda public bir Class Tanımladım.
  • Class içinde 2 adet değişken tanımladım.
  • isim değişkeni publiği referans olarak aldı.
  • yas değişkeni ise private sahip olduğu için nesne üstünden erişemedik.

Örnek 2:

Aşağıda bazı tanımlamalar yaptık.

Struct Yapısı Nedir ? Class ile Farkları

Tam Sınıf yapsını anladık derken nereden çıktı bu Struct yapısı 🙂 Struct yapısıda tipik bir Class gibi davranır .Fakat class ile birebir aynı özelliklere sahip değildir.

Farkları Ve Özelliklerİ

  • Öncelikle Struct yapısında miras alma diye bir olay yoktur.Bu özellikle Class’a özgü bir özelliktir.
  • Ayrıca Struct için init yani yapıcı method tanımlama zorunluluğu yoktur.Varsayılan olarak kendi içinde bunu barındırır.
  • Sınıflar referans tipinde işlem yapar.Struct ise değer tipi ile.
  • Her ikiside Extend edilebilir (Extensions ile .)
  • Değer Türü: Bir değer türünü kopyaladığınızda (yani, atandığında, başlatıldığında veya bir işleve geçirildiğinde), her örnek verilerin benzersiz bir kopyasını tutar. Bir örneği değiştirirseniz, diğeri de değişmez.
  • Referans Türü: Bir başvuru türünü kopyaladığınızda, her örnek verileri paylaşır. Referansta ise  kendisi kopyalanır,  Birini değiştirdiğinizde diğeri de değişir.

Bir örneğe bakalım:


Önceki örneğin aynısını Struct yapalım.

Bu görsel boş bir alt niteliğe sahip; dosya adı Ekran-Resmi-2020-11-08-13.59.26.png

Swift’de yapılar değer türleridir, sınıflar ise başvuru türleridir. Bir yapıyı kopyaladığınızda, verilerin iki benzersiz kopyasına sahip olursunuz. Bir sınıfı kopyaladığınızda, verinin bir örneğine iki başvuru elde edersiniz. Bu çok önemli bir farktır ve sınıflar veya yapılar arasındaki seçiminizi etkiler.

Class ile Örnek:Farklara Bakalım

  • Myinsan Nesnemim İçinde Ali var
  • Myınsan içinde ki değeri Myinsan 2 ye kopyalamış olduk.
  • Atanan degerden sonra tekrar isim değişkenine değer verdim.
  • Sonuç olarak mehmet çıktı Burda ki olay 2 nesnenin aynı yeri referans etmesidir.

Struct İle Örnek :Farklara Bakalım

  • Myinsan nesnesi içinde Anil var
  •  Myinsan da kı degerı myınsan2 aktardık.İşte bu aktarm işleminde Bellekt 2 farklı alan açarak bu işlemi yapar Myinsa ve myinsan 2 birinriden etkilenmemiş oldu.
  • print(myinsan.isim!)  Bu yüzden myinsanı bastığımda Anil değeri çıktı

Bir Sonra ki bölüme sago-go go go 🙂

Leave a Reply

*