ProgramlamaiOS mimarı/kütüphane geliştiricisi

Yerleşik türler (nested types) ve Swift'te üyeler için erişim kontrolü nasıl çalışır? Modüllerin ve kütüphanelerin birleştirilmesi sırasında hangi erişilebilirlik nüansları ortaya çıkabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Eğer ana tür internal olarak tanımlanmışsa, yerleşik tür daha açık olamaz, ancak daha "kapalı" olabilir (örneğin, dış public, yerleşik private).
  • Farklı modüllerde (framework'lerde) derleme sırasında, 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.

Alakalı bir soru.

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 }

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


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 internal olarak 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 public olarak tanımlanırken, kapsayıcı tür internal idi. 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.