Что такое Value Type (тип-значение) в Swift?

Ответ

Value Type — это тип, экземпляр которого хранит непосредственное значение данных. При присваивании или передаче в функцию/метод создается новая независимая копия этого значения.

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

  • Копирование по значению (Copy-on-Assignment): Каждая переменная имеет свою собственную копию данных.
  • Изменения изолированы: Модификация копии не влияет на оригинал.
  • Хранение: Как правило, размещаются в стеке (быстрее), но могут быть и в куче, если это необходимо.

Примеры в Swift:

  • Все базовые типы: Int, Double, Bool, String.
  • Коллекции из стандартной библиотеки: Array, Dictionary, Set (они реализованы как структуры).
  • Пользовательские struct и enum.

Пример:

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

var pointA = Point(x: 10, y: 20)
var pointB = pointA // Создается ПОЛНАЯ КОПИЯ значения

pointB.x = 100 // Меняется только pointB
print(pointA.x) // 10 (pointA остался неизменным)
print(pointB.x) // 100

Преимущества: Потокобезопасность, предсказуемость поведения и отсутствие неявного разделяемого состояния.

Ответ 18+ 🔞

Э, слушай, а вот эти ваши Value Type, они же, блядь, как деревянные солдатики! Каждому — своя отдельная фигурка, в рот меня чих-пых!

Представь, у тебя есть бумажка с числом, ну, Int там, десять. Ты её скопировал — получил вторую такую же бумажку. На одной написал «100», а на другой всё ещё «10» красуется. Это и есть, блядь, копирование по значению. Каждая переменная — это свой собственный, независимый кусок данных, свой личный солдатик. Изменяешь одного — другой стоит себе, как вкопанный, и нихуя не происходит.

Где они водятся, эти типы-значения? Да везде, сука! Все примитивы — Int, Double, Bool — они такие. Строка (String) — тоже, хоть и хитрая жопа внутри. А ещё, внимание, ёпта, все стандартные коллекции: Array, Dictionary, Set — они ведь реализованы как структуры, а значит, тоже value type! Ну и, само собой, твои кастомные struct и enum.

Смотри, как это работает на практике:

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

var pointA = Point(x: 10, y: 20) // Вот тебе первый солдатик.
var pointB = pointA // Блядь, клонировали! Теперь есть ВТОРАЯ, полностью независимая копия!

pointB.x = 100 // Долбанули по второму солдатику.
print(pointA.x) // 10 (Первому хоть бы хны! Он в ахуе с наших манипуляций.)
print(pointB.x) // 100

В чём, сука, их сила? А сила в том, что с ними спокойно, как в танке. Потокобезопасно, предсказуемо, и никаких неожиданных пиздецов, когда кто-то на другом конце проекта меняет твои данные, а ты потом охуеваешь. Состояние не шарится по углам, у каждого своя избушка на курьих ножках. Красота, ёпта!