Swift Skop Belirteçleri - Access Control


Skop Belirteçleri

Swift’te skop yani faaliyet alanı belirten dört adet anahtar sözcük bulunmaktadır. Bu anahtar sözcükler encapsulation prensibinin uygulanmasını sağlamaktadır. Bu prensip; “modellenmeye çalışılan sisteme ait bazı kritik özellik veya işlevlerin, o sistemi kullanacak olan taraftan bilinçli olarak gizlenmesi” biçiminde tanımlanır.
Resmi dokümantasyon “erişim kontrolü” başlığı altında incelenen model, kaynak kod dosyaları ve modüllere dayandırılmıştır. Modül; kod dağıtım birimi.
  1. public: Uygulamanın herhangi bir yerinden erişilmesi istenilen sınıflar, yapılar ve üyeler için kullanılır.
  2. open: Public tek modülde tüme erişim sağlarken 2 modül olması durumunda diğer modüle erişim için open kullanılmaktadır. Subclass tanımlanan class başında ve override edilecek methodlarda tanımlamamız gerekmektedir.
  3. internal: Varsayılan (default) skop belirteci olan internal, söz konusu unsurun sadece tanımlandığı modülde kullanılabilmesini sağlar. Modül, uygulama veya kütüphane olarak somutlanabilen bir faaliyet alanı tanımlar. Bu anahtar sözcükle tanımlanmış bir unsura ait olduğu modüldeki her dosyadan erişim sağlanabilir ancak aksi mümkün değildir.
  4. private: Tanımlanmış olan bir unsura sadece tanımlandığı dosyadan erişilebilir. Örneğin bir sınıfa ait veri elemanı private tanımlanmış ise kendisine sadece tanımlandığı sınıf ve o sınıfın olduğu dosyadaki olası farklı sınıflardan erişim mümkün olacaktır.
  5. fileprivate: Kaynak kod dosyası seviyesinde erişimi kısıtlamaya yarar.


Not: Varsayılan skop belirteci internal olmakla beraber istisnai olarak private bir sınıfa ait ve özel olarak bir skop belirteci ile tanımlanmamış tüm üyeler internal değil private olurlar.

Örnek: Aşağıdaki uygulamada Sample ve Test isimli sınıflar aynı dosya içerisinde yazılmışlardır. Dolayısıyla (private olan üyelere de dahil) tüm üyelere yapılan erişimler geçerlidir.

public class Sample {
var a: Int = 0
public var b : Int = 0
private var c : Int = 0
internal var d : Int = 0

public func foo() {
 print(“foo”) 
 }

private func bar() {
 print(“bar”) 
 }
}


public class Test {
func start() {
var obj : Sample = Sample()
obj.a = 1
obj.b = 2
obj.c = 3 
obj.d = 4
obj.foo()
obj.bar()  
}
}

var test = Test()
test.start()

Ancak Test sınıfı ve test nesnesinin kullanımına ilişkin kodlar ayrı bir dosyada yazılacak olursa “c ve bar” isimli üyelere – private olarak tanımlanmış olmalarından dolayı – yapılacak erişimler hataya sebep olur.

Örnekler:

public class A //Açıkça public class
{

public var x = 0 //Açıkça public üye

var y = 0 //Gizlice internal üye

fileprivate func foo() { } //Açıkça file private üye

private func bar() { } //Açıkça private üye

}


class B { //Gizlice internal class

var x = 0 //Gizlice internal üye

fileprivate func foo() { } //Açıkça fileprivate üye

private func bar() { } //Açıkça private üye

}


fileprivate class C{ //Açıkça fileprivate class

func foo() { } // Gizlice fileprivate class

private func Bar() { } //Açıkça private üye

}


private class D{ //Açıkça private class

func foo() { } //Gizlice private üye


}