Nei linguaggi di programmazione della famiglia C (incluso Objective-C) sono sempre esistiti i "metodi di classe" (class methods). In Swift sono stati introdotti due tipi di metodi per i tipi — static e class. Questi permettono di chiamare metodi sul tipo stesso, non su un'istanza. Static viene utilizzato per strutture, enumerazioni e classi rigorosamente senza possibilità di sovrascrittura, class — per classi con possibilità di essere sovrascritti nelle sottoclassi.
Problema: La confusione tra static e class sorge nella gerarchia delle classi, dove è possibile l'ereditarietà e si desidera consentire o vietare la sovrascrittura di metodi/proprietà per i discendenti.
Soluzione:
Esempio di codice:
class Animal { class func makeSound() { print("Some generic animal sound") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Woof!") } // override static func kingdom() — errore: static non può essere sovrascritto! } Animal.makeSound() // Some generic animal sound Dog.makeSound() // Woof! print(Animal.kingdom()) // Animalia
Caratteristiche principali:
È possibile utilizzare class func in struct o enum?
No, class func è consentito solo per le classi. Struct e enum supportano solo metodi e proprietà statiche.
Può una proprietà static essere computata e/o mutabile (var)?
Sì, una proprietà static può essere sia computata (computed) che memorizzata (stored), e può essere definita tramite static var. Per struct e enum questo è l'unico modo per rendere la proprietà accessibile tramite il tipo stesso, non tramite un'istanza.
Esempio di codice:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
È possibile chiamare un metodo di classe tramite un'istanza della classe?
Sì, ma non è raccomandato: il metodo di classe si riferisce sempre al tipo, non a un oggetto specifico, quindi verrà chiamato il comportamento del tipo originale o quello sovrascritto, e non ha nulla a che fare con un oggetto specifico.
Utilizzo di class func per utilità statiche della classe, anche se non è prevista la sovrascrittura.
Vantaggi:
Svantaggi:
Utilizzo di static per costanti e utilità, class — per metodi di fabbrica, che possono realmente essere modificati nelle sottoclassi.
Vantaggi:
Svantaggi: