К какому типу данных относится структура в Swift?

Ответ

Структура (struct) в Swift — это тип-значение (value type).

Ключевые характеристики:

  • При присваивании или передаче создаётся новая, независимая копия данных.
  • Каждый экземпляр хранит свои собственные данные. Изменения в одной копии не влияют на другие.
  • Обычно размещаются в стеке (что обеспечивает высокую производительность), но это деталь реализации.
  • Не поддерживают наследование.
  • Для изменения свойств экземпляра внутри метода требуется ключевое слово mutating.

Пример, демонстрирующий семантику значения:

struct Coordinates {
    var x: Int
    var y: Int
}

var pointA = Coordinates(x: 5, y: 10)
var pointB = pointA // Создаётся полная копия значений
pointB.x = 20 // Меняется только копия

print(pointA.x) // Вывод: 5. Исходный экземпляр не изменился.
print(pointB.x) // Вывод: 20

Ответ 18+ 🔞

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

Короче, запомни главное: когда ты копируешь структуру, она не ссылку тебе даёт, а создаёт новую, отдельную, независимую хуйню. Как будто ксерокснул документ. На одном написал «Долгов нет», на другом «Долгов дохуя». Первый-то от этого не изменится, ёпта.

Ещё фишка: чтобы внутри метода поменять свойства самой структуры, надо крикнуть mutating. Это как сказать: «Так, стой, я сейчас тут внутри себя поковыряюсь, не пугайся». Без этого слова компилятор тебе мозги выест — «ты чё, сука, меняешь неизменяемое?».

И да, наследование им нахуй не нужно. Они самодостаточные, как холостяки. Всё своё ношу с собой.

Смотри, как это работает, на примере. Представь координаты точки:

struct Coordinates {
    var x: Int
    var y: Int
}

var pointA = Coordinates(x: 5, y: 10) // Вот точка А, живи, радуйся.
var pointB = pointA // А вот мы создали точку Б, скопировав А. Полную, блядь, копию!
pointB.x = 20 // Мы тут в точке Б по X накосячили, поменяли на 20.

print(pointA.x) // Вывод: 5. Видишь? Точка А как была 5, так и осталась! Ей похуй на твои эксперименты с Б.
print(pointB.x) // Вывод: 20. А вот Б уже другая история, её отдельная.

Вот и вся магия, блядь. Скопировал — и живёшь отдельно. Никаких неожиданных изменений «из-за угла», как с классами. Просто, предсказуемо и, в большинстве случаев, охуенно быстро.