Можно ли переопределить (override) статический (static) метод в Swift?

Ответ

Нет. Статические (static) методы и свойства принадлежат самому типу, а не его экземплярам, и не поддерживают полиморфизм, поэтому их нельзя переопределить в подклассе.

Для создания методов класса, поддерживающих переопределение, используйте ключевое слово class.

Пример:

class Parent {
    class func someMethod() {
        print("Parent method")
    }
}

class Child: Parent {
    override class func someMethod() {
        print("Child method")
    }
}

Почему? Модификатор static является псевдонимом для class final — он делает метод финальным, что исключает возможность переопределения в иерархии наследования.

Ответ 18+ 🔞

А, ну это же классика, блядь! Сидишь такой, пишешь код, всё пучком, а потом — бац! — и на тебе: «Нет, сука, нельзя!». Как будто в дверь постучали и сказали: «Ты тут, дружок, не на той ветке сидишь, иди нахуй».

Так вот, слушай сюда, разберём эту дичь. static — это как твой старый, блядь, диван, который намертво прикручен к полу в гостиной. Он принадлежит дому (типу), а не тебе лично (экземпляру). И как ты его ни крути, переставить в спальню или нахуй выкинуть — нихуя. Он там навечно. Поэтому когда ты в наследнике (Child) пытаешься его «переопределить» — это как пытаться на старый диван натянуть новый чехол и назвать его кроватью. Не, чувак, не прокатит. Компилятор тебе так и скажет: «Иди нахуй, это final, блядь».

А если тебе реально надо, чтобы метод был у класса, но чтобы его ещё и переписать можно было — вот тебе волшебное слово: class. Это как диван на колёсиках, блядь. Вроде тоже в гостиной стоит (принадлежит типу), но его можно покатить в другую комнату и немного переделать под себя.

Смотри, как это выглядит без всякой, блядь, пиздобратии:

class Parent {
    // Это можно переопределить, потому что class
    class func flexibleMethod() {
        print("Родительский метод, не статичный, живой ещё")
    }

    // А это НЕЛЬЗЯ, потому что static (а на деле class final)
    static func rigidMethod() {
        print("Родительский метод, прибитый гвоздями")
    }
}

class Child: Parent {
    // Так — можно, ебать оно всё конём!
    override class func flexibleMethod() {
        print("Дочерний метод, всё переиграли")
    }

    // А так — НИЗЯ! Попробуй — получишь пизды от компилятора.
    // override static func rigidMethod() { } // ОШИБКА: Cannot override static method
}

Короче, запомни, как «Отче наш»:

  • Хочешь прибить метод намертво к типу, чтобы никто, даже наследники, не мог его тронуть — static.
  • Хочешь, чтобы метод был у типа, но оставить люфт для манёвра потомкам — class.

Всё просто, как три, блядь, копейки. Не усложняй, а то опять на оверрайд статики попрёшься и будешь тут охуевать.