C aileleri programlama dillerinde (Objective-C dahil) her zaman "sınıf yöntemleri" (class methods) bulunmaktaydı. Swift'te bu yöntemlerin iki türü bulunmaktadır: static ve class. Bu yöntemler, bir nesneden ziyade tür üzerinde yöntem çağrısı yapılmasına olanak tanır. Static, yapılar, enum'lar ve kalıtımda yeniden tanımlama olanağı olmaksızın kesinlikle kullanılmak üzere, class ise alt sınıflarda yeniden tanımlama olanağı tanımak için kullanılır.
Sorun: Static ile class arasındaki karışıklık, kalıtımın mümkün olduğu sınıf hiyerarşilerinde, alt sınıflar için yöntemler / özelliklerin yeniden tanımlanmasını izin verilip verilmeyeceği konusunda ortaya çıkar.
Çözüm:
Kod örneği:
class Animal { class func makeSound() { print("Bazı genel hayvan sesleri") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Hav! Hav!") } // override static func kingdom() — hata: static yeniden tanımlanamaz! } Animal.makeSound() // Bazı genel hayvan sesleri Dog.makeSound() // Hav! Hav! print(Animal.kingdom()) // Animalia
Anahtar özellikler:
Struct veya enum'da class func kullanılabilir mi?
Hayır, class func yalnızca sınıflar için geçerlidir. Struct ve enum yalnızca static yöntemler ve özellikler destekler.
Static property computed ve/veya değiştirilebilir (var) olabilir mi?
Evet, static property hem hesaplanabilir (computed) hem de saklanan (stored) olabilir ve static var ile tanımlanabilir. Struct ve enum için, özelliği tür üzerinden değil, örnek üzerinden erişilebilir kılmanın tek yoludur.
Kod örneği:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
Class method, sınıfın bir örneği aracılığıyla çağrılabilir mi?
Evet, ancak bu önerilmez: class method her zaman tür ile ilişkilidir, belirli bir nesne ile değil, bu nedenle orijinal türün veya yeniden tanımlamanın davranışı çağrılır ve belirli bir nesne ile ilgisi yoktur.
Statik yardımcılar için class func kullanılması, ancak yeniden tanıma beklenmiyor.
Artılar:
Eksiler:
Sabitler ve yardımcılar için static, gerçekten alt sınıflarda değiştirilebilen fabrika yöntemleri için class kullanımı.
Artılar:
Eksiler: