Ответ
Различие заключается в том, к чему принадлежит метод и можно ли его переопределить.
| Тип метода | Принадлежит | Доступ через | Переопределение |
|---|---|---|---|
| Метод экземпляра | Экземпляру типа (self). |
Экземпляр: object.method(). |
Да, в подклассах. |
static метод |
Самому типу. Не имеет доступа к self экземпляра. |
Тип: Type.method(). |
Нет. Фактически является final class методом. |
class метод |
Самому типу. | Тип: Type.method(). |
Да, в подклассах (с ключевым словом override). |
Пример:
class Vehicle {
// Метод экземпляра
func startEngine() { print("Vroom!") }
// Статический метод (непереопределяемый)
static func commonFeature() { print("All vehicles have wheels.") }
// Классовый метод (переопределяемый)
class func makeSound() { print("Some generic vehicle sound") }
}
class Car: Vehicle {
// Можно переопределить метод экземпляра
override func startEngine() { print("Car engine started!") }
// НЕЛЬЗЯ переопределить static метод
// override static func commonFeature() { } // Ошибка!
// Можно переопределить class метод
override class func makeSound() { print("Beep beep!") }
}
// Использование:
Vehicle.commonFeature() // "All vehicles have wheels."
Car.commonFeature() // "All vehicles have wheels." (унаследован)
Vehicle.makeSound() // "Some generic vehicle sound"
Car.makeSound() // "Beep beep!" (переопределен)
Для структур и перечислений используется только static, так как они не поддерживают наследование.