value type vs reference type — как выбирать?
Суть
- Value-типы (
struct,enum, кортежи,Array/String/...) — у переменной своя копия; изменение одной не затрагивает другую. Нет идентичности, нет наследования, нетdeinit. Живут на стеке или внутри владельца, ARC не нужен (если внутри нет ссылок). - Reference-типы (
class,actor, замыкания) — переменные разделяют один объект в куче; у него есть идентичность (===), счётчик ссылок,deinit, наследование (у классов).
struct Point: Sendable { // value-тип без ссылок — Sendable бесплатно
var x: Double, y: Double
}
final class Canvas { // идентичность: один холст, много ссылок
var points: [Point] = []
}
var a = Point(x: 0, y: 0)
var b = a // копия
b.x = 1
print(a.x, b.x) // 0.0 1.0
let c1 = Canvas()
let c2 = c1 // та же ссылка
c2.points.append(a)
print(c1.points.count) // 1
struct Model { // ловушка: value-тип с классом внутри
var canvas = Canvas() // копии Model делят один Canvas
}
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep