В каких случаях в Swift следует использовать классы (`class`)?

Ответ

Классы (class) в Swift используются, когда требуется ссылочная семантика и управление идентичностью объекта.

Основные сценарии применения:

  1. Наследование: Когда нужно создать иерархию типов, где подклассы наследуют и переопределяют поведение родителя.
    class Vehicle {
        var currentSpeed = 0.0
        func makeSound() { print("...") }
    }
    class Car: Vehicle {
        var gear = 1
        override func makeSound() { print("Vroom!") }
    }
  2. Разделяемое состояние: Когда несколько частей кода должны ссылаться и модифицировать один и тот же экземпляр.
  3. Управление жизненным циклом: При необходимости выполнить cleanup в деинициализаторе (deinit).
  4. Совместимость с Objective-C: Если класс должен быть доступен в Objective-C-коде (наследуется от NSObject).

Ключевое отличие от структур: Экземпляры класса передаются по ссылке. При присваивании или передаче в функцию создается новая ссылка на тот же объект в памяти.

Ответ 18+ 🔞

А, классы в Swift, ну это ж классика, блядь! Это когда тебе нужно, чтобы все твои переменные дружно смотрели на одну и ту же хуйню в памяти и дружно её же и меняли. Как в коммуналке, блядь: один срать пошёл — все знают.

Так когда же этот ваш class впендюрить?

  1. Наследование, ёпта! Вот это прям пиздец как иногда нужно. Сделал ты класс Транспорт, а потом думаешь: "А машина-то что? Тоже транспорт, блядь!". И вот ты уже пишешь class Машина: Транспорт, и она всё от родителя получает, а ещё и свою передачку может добавить. Красота, ебать!
    class Транспорт {
        var текущаяСкорость = 0.0
        func издайЗвук() { print("...") } // Тишина, блядь, едет и молчит
    }
    class Машина: Транспорт {
        var передача = 1
        override func издайЗвук() { print("Врум-врум!") } // А вот это уже наш клиент!
    }
  2. Разделяемое состояние. Вот представь: у тебя есть МенеджерДанных, один на весь апп. И все экраны, все кнопки — они все должны тыкать в один и тот же экземпляр, а не плодить сущностей. Вот тут class — твой бро. Передал ссылку, и все довольны, все видят одни и те же данные. Пока не начнут одновременно писать, конечно, тогда пиздец, но это уже другая история.
  3. Управление жизненным циклом. Слушай, а бывает же, что объект что-то делает — файлы открывает, сетевые соединения держит. И когда его убивают, надо всё аккуратно прибрать. Вот для этого в классе есть волшебный метод deinit. Сказали объекту "пиздуй" — он на прощание успеет за всеми дверьми прикрыть. У структур такой фичи нет, они просто испаряются.
  4. Совместимость с Objective-C. Ну это если ты, сука, мазохист и работаешь со старым легаси-кодом. Тогда твой класс должен быть от NSObject, иначе старый код на тебя смотреть не будет, как на говно.

А главная разница с struct в чём? Да в том, блядь, что класс — это как визитка. Дал ты свою визитку десяти людям. Они все по ней звонят — звонят тебе одному. Изменил ты в визитке номер — у всех он автоматически меняется, пиздец! А структура — это как ксерокс. Сделал копию, отдал. У того человека свой листочек. Можешь на своём хоть хуй нарисовать — на его копии ничего не изменится. Вот и вся философия, в рот меня чих-пых!