Какие reference types существуют в Swift?

Ответ

В Swift к reference types (типам-ссылкам) относятся:

  1. Классы (class):

    • Хранятся в куче (heap).
    • При присваивании или передаче в функцию копируется только ссылка на один и тот же экземпляр.
    • Управление памятью через ARC (Automatic Reference Counting).
      class Person {
      var name: String
      init(name: String) { self.name = name }
      }
      let alice = Person(name: "Alice")
      let bob = alice // bob и alice ссылаются на ОДИН объект
      bob.name = "Bob"
      print(alice.name) // "Bob"
  2. Замыкания (closure):

    • Также являются reference types.
    • Даже если захватывают value types (структуры), само замыкание размещается в куче.
  3. Акторы (actor):

    • Введены в Swift 5.5 для безопасной параллельной работы.
    • Являются reference types, но обеспечивают изоляцию (actor isolation), синхронизируя доступ к своим изменяемым свойствам.
      actor BankAccount {
      private var balance: Double = 0
      func deposit(_ amount: Double) { balance += amount }
      }

Контраст с Value Types: В отличие от структур (struct), перечислений (enum) и кортежей (tuple), изменение экземпляра reference type через одну ссылку влияет на все другие ссылки на этот объект.

Ответ 18+ 🔞

Давай разберём эту тему, пока у меня ещё не взорвалась голова от этих ваших ссылок и значений. Ну что за жизнь, блядь!

Вот смотри, в Swift есть такие типы, которые ведут себя как последние эгоисты — reference types, или, по-нашему, типы-ссылки. Их главная фишка в том, что они все ссылаются на одну и ту же штуку в памяти. Изменил в одном месте — везде поменялось, и потом сиди и гадай, кто тут всё сломал. Красота!

Кто же в этой банде состоит?

  1. Классы (class): Это классические засранцы. Живут они в куче (heap), как короли. Скопировать класс? Да хуй там! При присваивании копируется только бумажка с адресом, а сам дворец остаётся один. Все начинают тыкать в него пальцами.

    class Person {
        var name: String
        init(name: String) { self.name = name }
    }
    let alice = Person(name: "Alice")
    let bob = alice // bob и alice — это две бумажки на один и тот же дом, ёпта!
    bob.name = "Bob" // Пришли к Бобу, дверь поменяли...
    print(alice.name) // "Bob" // А Алиса уже дома не узнаёт! Сюрприз, сука!

    Памятью за ними убирает ARC — он как дворник, считает, сколько бумажек с адресом на этот дом раздали. Бумажки кончились — дом снесли. Вроде логично, а иногда овердохуища проблем.

  2. Замыкания (closure): А вот эти ребята — тихие, но опасные. Они тоже ссылочные! Даже если внутри они захватили какую-нибудь скромную структурку-значение, само замыкание-то живёт в куче. Сюрприз, блядь! Получается такая хитрая жопа: вроде value type, а по факту — reference.

  3. Акторы (actor): Это новейшие выскочки, с Swift 5.5. Тоже reference types, но с претензией на безопасность. Они как квартира с домофоном: зайти может только один в момент времени, остальные ждут в очереди. Чтобы не было драк за общий холодильник (читай — данные).

    actor BankAccount {
        private var balance: Double = 0
        func deposit(_ amount: Double) { balance += amount }
    }

    Вроде умно, но мозг всё равно выносит, когда начинаешь это всё применять.

А теперь контрастный душ, блядь! Value Types (структуры, перечисления, кортежи) — это полная противоположность. Это как если бы ты каждому раздал по своей личной, независимой копии бутерброда. Один свой сгрыз — другому хоть бы хны. Честно, предсказуемо, никаких сюрпризов.

А с этими reference type история одна: тронул в одном месте — и пошла цепная реакция, пиздец. Волнение ебать! С одной стороны, мощно и эффективно, с другой — подозрение ебать чувствую, что где-то уже что-то не так пошло. Чих-пых тебя в сраку, Swift, ну и намудрили же!