Swift'te erişim seviyeleri (private, fileprivate, internal, public, open) sadece sınıfları, yapıları ve onların özelliklerini değil, aynı zamanda yerleşik (nested) türleri de etkiler. Yerleşik tür, başka bir belirtilen kısıtlama olmadığı sürece, çevresindeki tipin erişim seviyesini varsayılan olarak miras alır.
Ana nüanslar:
internal olarak tanımlanmışsa, yerleşik tür daha açık olamaz, ancak daha "kapalı" olabilir (örneğin, dış public, yerleşik private).internal olarak tanımlanan yerleşik türler diğer modüllerden görünmeyecektir.Örnek:
public class A { public struct B { fileprivate func foo() {} } }
Bu örnekte A ve B halka açıktır, ancak foo() metodu dosyaya özeldir.
Soru: "Yerleşik bir tür, çevreleyen türden daha yüksek bir erişim seviyesine sahip olabilir mi?"
Cevap: Hayır, yerleşik bir türün erişim seviyesi çevreleyen türün erişim seviyesini aşamaz. Daha yüksek bir erişim seviyesiyle yerleşik bir tür tanımlanmaya çalışılırsa, derleyici hata verecektir.
Hata örneği:
internal struct MyStruct { public enum MyEnum { ... } // Hata: public, internal içinde olamaz }
Hikaye 1
Genel bir framework'te yerleşik yapıların erişim seviyeleri dış türlerle senkronize edilmemişti. Yayın sürümünde, iç enum'ların müşteri uygulamasında kullanılamaması ile sonuçlandı ve acil bir arayüz değişikliği gerekti.
Hikaye 2
Büyük bir projede, iç hizmet nesnesinin içinde
internalolarak tanımlanmış bir durum sınıfı vardı. Bu sınıfa bağımlı yeni bir modül eklendikten sonra, erişim seviyesinin yükseltilmesi ve SDK'nın tamamen yeniden derlenmesi olmadan entegrasyon mümkün olmadı.
Hikaye 3
Karmaşık bir kütüphanede, bazı yerleşik yapılar
publicolarak tanımlanırken, kapsayıcı türinternalidi. Yeni bir sürüme geçiş sırasında, dış bağlamda derlenmeyen halka açık türlerden dolayı kritik hatalar meydana geldi ve bu da birden fazla ekip için güncellemeyi engelledi.