Swift'te tür üyelerine (özellikler, yöntemler vb.) ve türlere erişim için beş seviye vardır:
open — en yüksek kamuya açıklık derecesi. Modül dışındaki yerlerde bile miras alınabilir ve yeniden tanımlanabilir.public — modül dışında erişilebilir, ancak yeniden tanımlanamaz/miras alınamaz.internal (varsayılan) — modül içinde erişilebilir.fileprivate — yalnızca dosya çerçevesinde erişilebilir.private — yalnızca tanım alanının içinde erişilebilir (extension da bu kapsamda).private'ı tanım dışında görünmemesi gereken mantık için kullanın.fileprivate — tek bir dosyada veri alışverişine ihtiyaç varsa (örneğin, iki ilişkili extension arasında).internal — modül içinde herkese açık olanlar için varsayılan.public/open — diğer modüller/framework'ler tarafından kullanılan API'ler için.open class MyOpenClass {} public class MyPublicClass {} internal class InternalClass {} fileprivate class FilePrivateClass {} private class PrivateClass {}
Açık ile public bir sınıf tanımlarken arasındaki fark nedir? Neden tüm public sınıflar miras alınabilir değil?
Cevap:
open, sınıf/yöntemin kendi modülünün dışındaki yerlerde yeniden tanımlanabilir ve miras alınabilir olduğunu işaret eder. public yalnızca kullanıma erişimi açar, ancak modül dışındaki mirasçılar yapmayı sağlamaz. Bir yandan, bu uygulamayı istenmeyen değişikliklerden korur, diğer yandan yalnızca gerekli genişletme noktalarını açar.
public class PublicClass {} open class OpenClass {} // Başka bir modül: class InheritFromOpen: OpenClass {} // TAMAM class InheritFromPublic: PublicClass {} // HATA!
Hikaye
Ortak bir kütüphanede sınıf public olarak işaretlenmişti ve dış bir proje, yöntemleri yeniden tanımlayarak onu genişletmeye çalıştı. Proje, public ile open arasındaki farkın yanlış anlaşılmasından dolayı derlenmedi — bu ekip için arayüz üzerinde bir haftalık ek çalışma maliyetine mal oldu.
Hikaye
Bir dosyanın içinde, bir extension'dan private bir özelliğe erişmeye çalıştılar — ancak özellik fileprivate olarak değil, private olarak tanımlanmıştı. Bu, yalnızca entegrasyon derlemesinde fark edilen bir derleyici hatasına yol açtı.
Hikaye
Birden fazla framework içeren bir uygulamada, tüm türler internal (varsayılan) olarak işaretlenmişti. Modüller arasında türleri kullanmak gerektiğinde, arayüz erişilemez hale geldi — public olan onca bildirimi yeniden yazmak zorunda kaldılar, bu da ek zaman ve test maliyeti gerektirdi.