Ответ
В 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 только если планируете переопределение в подклассах.