Ответ
Ключевое отличие — возможность переопределения (override) в подклассах.
| Ключевое слово | Переопределение | Использование в протоколах |
|---|---|---|
static func |
Невозможно. Метод или свойство запечатано для данного типа. | Может требоваться протоколом (эквивалентно static). |
class func |
Возможно в подклассах (с ключевым словом override). |
Может требоваться протоколом (эквивалентно class). |
Правила выбора:
- Используйте
staticпо умолчанию для методов типа, если переопределение не предполагается. Это более строгое и ясное объявление. - Используйте
class, только если вам нужен полиморфизм на уровне типа (чтобы подклассы могли предоставить свою реализацию).
Пример:
class Formatter {
static func defaultFormat() -> String { return "General" }
class func customizableFormat() -> String { return "Base Customizable" }
}
class DateFormatter: Formatter {
// override static func defaultFormat() { } // Ошибка компиляции
override class func customizableFormat() -> String {
return "Date Specific"
}
}
print(Formatter.defaultFormat()) // "General"
print(DateFormatter.defaultFormat()) // "General" (наследуется)
print(DateFormatter.customizableFormat()) // "Date Specific" (переопределено)
Для class свойств (вычисляемых) действуют те же правила.