W językach programowania z rodziny C (w tym Objective-C) zawsze istniały „metody klasowe” (class methods). W Swift pojawiły się dwa typy takich metod dla typów — static i class. Pozwalają one na wywoływanie metod na samym typie, a nie na instancji. Static jest używane dla struktur, wyliczeń i klas, które nie mogą być nadpisywane, class — dla klas z możliwością nadpisania w klasach dziedziczących.
Problem: Zamieszanie pomiędzy static i class występuje w hierarchii klas, gdzie możliwe jest dziedziczenie i chcemy zezwolić lub zabronić nadpisywania metod/właściwości dla potomków.
Rozwiązanie:
Przykład kodu:
class Animal { class func makeSound() { print("Niektóre ogólne dźwięki zwierząt") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Hau!") } // override static func kingdom() — błąd: static nie może być nadpisany! } Animal.makeSound() // Niektóre ogólne dźwięki zwierząt Dog.makeSound() // Hau! print(Animal.kingdom()) // Animalia
Kluczowe cechy:
Czy można używać class func w struct lub enum?
Nie, class func jest dozwolone tylko dla klas. Struktury i wyliczenia wspierają tylko metody i właściwości static.
Czy właściwość static może być obliczeniowa i/lub mutowalna (var)?
Tak, właściwość static może być zarówno obliczeniowa (computed), jak i przechowywana (stored) i może być definiowana przez static var. Dla struktur i wyliczeń jest to jedyny sposób, aby właściwość była dostępna przez sam typ, a nie przez instancję.
Przykład kodu:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
Czy można wywołać metodę klasy przez instancję klasy?
Tak, ale nie jest to zalecane: metoda klasy zawsze odnosi się do typu, a nie do konkretnego obiektu, więc zostanie wywołane zachowanie oryginalnego typu lub nadpisania, a nie ma to związku z konkretnym obiektem.
Użycie class func dla statycznych narzędzi klasowych, chociaż nadpisywanie nie jest przewidziane.
Zalety:
Wady:
Użycie static dla stałych i narzędzi, class — dla metod fabrycznych, które mogą być rzeczywiście zmieniane w klasach dziedziczących.
Zalety:
Wady: