В чем разница между методами экземпляра, класса и статическими методами?

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

Ответ

В Swift существует три основных типа методов, отличающихся областью видимости и возможностью полиморфизма.

1. Метод экземпляра (Instance Method)

Работает с конкретным экземпляром класса/структуры. Имеет доступ к свойствам экземпляра через self.

class Counter {
    var count = 0
    // Метод экземпляра
    func increment() {
        count += 1 // Доступ к свойству экземпляра
        print(count)
    }
}
let myCounter = Counter()
myCounter.increment() // Вызов требует экземпляр

2. Метод класса (Class Method)

Объявляется с ключевым словом class func. Вызывается на самом типе, а не на экземпляре. Поддерживает переопределение в подклассах.

class Vehicle {
    class func description() -> String {
        return "A general vehicle"
    }
}

class Car: Vehicle {
    // Может быть переопределен
    override class func description() -> String {
        return "A car with wheels"
    }
}
print(Vehicle.description()) // "A general vehicle"
print(Car.description())    // "A car with wheels" (полиморфизм)

3. Статический метод (Static Method)

Объявляется с static func. Аналогичен методу класса, но не может быть переопределен в подклассах. Используется для утилитарных функций.

class MathUtils {
    static func square(_ x: Int) -> Int {
        return x * x
    }
}

class AdvancedMath: MathUtils {
    // Ошибка компиляции: нельзя переопределить static метод
    // override static func square(...) {}
}
print(MathUtils.square(5)) // 25

Сводка различий

Характеристика Метод экземпляра Метод класса (class) Статический метод (static)
Вызов На экземпляре: obj.method() На типе: Type.method() На типе: Type.method()
Доступ к self Экземпляр (self.property) Тип (Self.self) Тип (Self.self)
Переопределение Да (если не final) Да Нет
Использование Работа с состоянием объекта Фабричные методы, полиморфные утилиты Чисто утилитарные функции

Практический совет: используйте static по умолчанию для методов, не требующих полиморфизма. Переходите на class только если планируете переопределение в подклассах.