Ответ
В Swift к reference types (типам-ссылкам) относятся:
-
Классы (
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"
-
Замыкания (
closure):- Также являются reference types.
- Даже если захватывают value types (структуры), само замыкание размещается в куче.
-
Акторы (
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, или, по-нашему, типы-ссылки. Их главная фишка в том, что они все ссылаются на одну и ту же штуку в памяти. Изменил в одном месте — везде поменялось, и потом сиди и гадай, кто тут всё сломал. Красота!
Кто же в этой банде состоит?
-
Классы (
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 — он как дворник, считает, сколько бумажек с адресом на этот дом раздали. Бумажки кончились — дом снесли. Вроде логично, а иногда овердохуища проблем.
-
Замыкания (
closure): А вот эти ребята — тихие, но опасные. Они тоже ссылочные! Даже если внутри они захватили какую-нибудь скромную структурку-значение, само замыкание-то живёт в куче. Сюрприз, блядь! Получается такая хитрая жопа: вроде value type, а по факту — reference. -
Акторы (
actor): Это новейшие выскочки, с Swift 5.5. Тоже reference types, но с претензией на безопасность. Они как квартира с домофоном: зайти может только один в момент времени, остальные ждут в очереди. Чтобы не было драк за общий холодильник (читай — данные).actor BankAccount { private var balance: Double = 0 func deposit(_ amount: Double) { balance += amount } }Вроде умно, но мозг всё равно выносит, когда начинаешь это всё применять.
А теперь контрастный душ, блядь! Value Types (структуры, перечисления, кортежи) — это полная противоположность. Это как если бы ты каждому раздал по своей личной, независимой копии бутерброда. Один свой сгрыз — другому хоть бы хны. Честно, предсказуемо, никаких сюрпризов.
А с этими reference type история одна: тронул в одном месте — и пошла цепная реакция, пиздец. Волнение ебать! С одной стороны, мощно и эффективно, с другой — подозрение ебать чувствую, что где-то уже что-то не так пошло. Чих-пых тебя в сраку, Swift, ну и намудрили же!