В чем разница между static func и class func в Swift и когда что использовать?

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

Ответ

Ключевое отличие — возможность переопределения (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 свойств (вычисляемых) действуют те же правила.