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.
- public: Uygulamanın herhangi bir yerinden erişilmesi istenilen sınıflar, yapılar ve üyeler için kullanılır.
- 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.
- 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.
- 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.
- 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
}
Hiç yorum yok:
Yorum Gönder
Yorumunuz için teşekkür ederim.