В языках программирования семейства C (включая Objective-C) всегда существовали «классовые методы» (class methods). В Swift появились два типа таких методов для типов — static и class. Они позволяют вызывать методы на самом типе, а не на экземпляре. Static используется для структур, перечислений и классов строго без возможности переопределения, class — для классов с возможностью overrid-е в наследниках.
Проблема: Путаница между static и class возникает в иерархии классов, где возможно наследование и хочется разрешить или запретить переопределение методов/свойств для потомков.
Решение:
Пример кода:
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() — ошибка: static не может быть переопределён! } Animal.makeSound() // Some generic animal sound Dog.makeSound() // Woof! print(Animal.kingdom()) // Animalia
Ключевые особенности:
Можно ли использовать class func в struct или enum?
Нет, class func разрешено только для классов. Struct и enum поддерживает только static методы и свойства.
Может ли static property быть computed и/или mutable (var)?
Да, static property может быть как вычисляемой (computed), так и хранимой (stored), и определяться через static var. Для struct и enum это единственный способ сделать property доступным через сам тип, а не экземпляр.
Пример кода:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
Можно ли вызвать class method через инстанс класса?
Да, но это не рекомендуется: class method всегда относится к типу, а не конкретному объекту, поэтому вызовется поведение исходного типа или переопределения, а к конкретному объекту отношения не имеет.
Использование class func для статических утилит класса, хотя переопределения не предполагается.
Плюсы:
Минусы:
Использование static для констант и утилит, class — для фабричных методов, которые действительно могут быть изменены в наследниках.
Плюсы:
Минусы: