Предисловие

В Swift reference type представляет в виде классов, а value type в виде структур

Value Types

Виды: Array, Dict, Tuple, Struct, Enum, String

Mutability

struct SomeStruct {
	var property: Int = 1
	mutating func increaseProperty() { // необходимо ключевое слово mutating
		property += 1
	}
}

class SomeClass {
	var property: Int = 1
	func increaseProperty() {
		property += 1
	}
}

Copy-on-write

Нативные типы в 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

Интересный факт: Если компилятор сможет вычислить точный размер класса, то он его поместит в стэк