Swift: Erişim Belirleyiciler

Erişim belirleyiciler sayesinde, yazdığımız kodların diğer dosya veya modüllerden erişimini kontrol edebiliriz. Bu sayede bizim yazdığımız kod parçalarının detaylarına erişimi kısıtlayıp, kullanmak isteyenlere belirli erişim araçları sunarak kullanmalarına izin verebiliriz.

Class, Structure ve Enumeration’lara erişim belirleyici verebildiğimiz gibi bunlara ait özelliklere, metotlara veya init fonksiyonlarına da erişim kısıtı getirebiliriz.

Swift’ta şu an en az kısıtlayıcı olandan başlayarak:

  • open
  • public
  • internal
  • fileprivate
  • private

gibi sıralayabiliriz.

Eğer biz specific olarak yukarıdakilerden birini seçmez isek default olarak “internal” erişim kısıtılayıcısı atanmış olacaktır.

Anahtar Kelimeler

Modül –> Tek bir uygulama veya framework olarak yazılmış, diğer modüller tarafından “import” anahtar kelimesi ile kullanılabilen parçalardır.

Source File –> Modüller içerisinde kullanılan her bir Swift dosyasıdır.

Nested Type –> Bir tip içerisinde tanımlanmış tiplerdir.

1) Open

Aynı modülden veya dahil edilmiş başka bir modülden herhangi bir dosyadan erişime açık olduğunu belirtir. Ayrıca erişim sağlanabilen her yerde subclass olarak kullanılabilir ve öğeleri override edilebilir.

2) Public

Erişim olarak “open” ile aynı özelliklere sahiptir fakat subclass edilebilmesi ve öğelerinin override edilebilmesi için aynı modül içerisinde olması gerekmektedir.

3) internal

Default olarak belirlenmiş olarak belirlenen “internal”, aynı modül içerisinden erişime izin vermektedir.

4) fileprivate

Yalnızca tanımlandığı dosyadan erişime izin verir.

5) private

Tanımlanılan “scope” için kısıt getirir ki bu en kısıtlayıcı belirteçtir.

Not: Swift 4 öncesinde bir class içerisinde tanımlanan öğe eğer private ise extension’larından erişim sağlanamıyordu.

Erişim Belirleyicisi Belirlerken Dikkat Edilmesi Gerekenler

Daha fazla kısıtlayıcı erişim belirleyiciye sahip bir varlık içerisinde daha az kısıtlayıcıya sahip bir varlık tanımlamamalısınız. Çünkü örneğin private olan bir sınıf içerisinde public bir değişken olsa bile, sınıfa erişemeden değişkene zaten erişemeyiz.

Fonksiyonlarda erişim kısıtlayıcısı, fonksiyonun parametreleri, dönüş tipi ve kendisinin sahip olduğu erişim belirleyicilerinin en kısıtlı olanı olarak belirlenir.

Enumeration’da case’ler enum’ın kendisine ait erişim belirleyicisine sahip olacaktır ve özel olarak belirlenmez. Raw value ve associated type ise en fazla enum’ın kendisi kadar izin verici olabilir.

Nested type tanımlandığı tipe bağlı olarak default erişim belirleyicisine sahip olur. “Private” veya “fileprivate” içerisinde tanımlanan tipler içerisinde tanımlandığı tipin erişim belirleyecisine sahip olur. “Public” veya “internal” içerisinde tanımlanan tipler ise default olarak “internal” erişim belirleyicisine sahip olacaktır. “Public” olmaları isteniyorsa ayrıca belirtmek gerekecektir.

Bir alt sınıf, super sınıfından daha az kısıta sahip bir erişim belirleyiciye sahip olamaz. Yani bir sınıf  “private” belirleyiciye sahip ise alt sınıfları en fazla “private” kadar esnek olabilir.

Bir super sınıfın metodu, override edildiği alt sınıfta daha izin verici olabilir. Yani “public” bir üst sınıf içerisinde “fileprivate” olan bir metod, “internal” bir alt sınıfta yine “internal” bir erişim belirleyiciye sahip olabilir.

Bir nesne, sınıfından daha izin verici bir erişim belirleyiciye sahip olamaz. Örneğin bir sınıf private olarak tanımlandıysa, kendisinin bir nesnesi public olamayacaktır.

Sabitler, değişkenler ve özelliklerin getter ve setter’larının erişim belirleyicileri, otomatik olarak kendi erişim belirleyicileri olarak belirlenmektedir. Dilersek setter’a getter’ın sahip olduğu erişim belirleyicisinden daha kısıtlayıcı bir erişim belirleyicisi verebiliriz.

Örneğin yukarıdaki örnekte income, exactTax ve ratio default olarak Tax struct’ının erişim belirleyicisi olan “internal” olarak yaratıldı. Fakat sonrasında exactTax’ın setter’ı “private” olarak belirlendi. Böylece exactTax erişim olarak daha kısıtlı hale getirildi ve görüldüğü gibi oranın değişmesiyle beraber yeni değerine sahip oldu.

 

Bir cevap yazın