В Swift reference type представляет в виде классов, а value type в виде структур
Виды: Array, Dict, Tuple, Struct, Enum, String
struct SomeStruct {
var property: Int = 1
mutating func increaseProperty() { // необходимо ключевое слово mutating
property += 1
}
}
class SomeClass {
var property: Int = 1
func increaseProperty() {
property += 1
}
}
Нативные типы в Swift включают в себя такую фичу как copy-on-write
let a = SomeStruct()
let b = a
// В таком состоянии переменные a и b ссылаются на одну область памяти,
// потому что мы не модифицировали инстанс, созданный в переменной a
let a = SomeStruct()
let b = a + something
// А вот тут и происходит магия copy-on-write.
// Копируется значение переменной a, происходит его модификация и
// выделяется отдельная ячейка памяти
Copy-on-write можно реализовать самому тоже(для своих типов)
final class Ref<T> {
var val: T
init(v: T) {
val = v
}
}
struct Box<T> {
var ref: Ref<T>
init(x: T) {
ref = Ref(x)
}
var value: T {
get {
ref.val
}
set {
if (!isKnownUniquelyReferenced(&ref)) {
ref = Ref(newValue)
} else {
ref.val = newValue
}
}
}
}
Поэтому, если прогнать через MemoryDumper то граф будет огромным в отличие от Struct
Интересный факт: Если компилятор сможет вычислить точный размер класса, то он его поместит в стэк