В чем разница между обычными методами экземпляра, `static` и `class` методами в Swift?

«В чем разница между обычными методами экземпляра, `static` и `class` методами в Swift?» — вопрос из категории Swift Core, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Различие заключается в том, к чему принадлежит метод и можно ли его переопределить.

Тип метода Принадлежит Доступ через Переопределение
Метод экземпляра Экземпляру типа (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, так как они не поддерживают наследование.