Sobes.tech
Junior

What are the differences between value types and reference types in Swift?

sobes.tech AI

Answer from AI

Value Types and Reference Types differ in the way data is stored and passed.

Value Types:

  • Assignment creates an independent copy of the data.
  • Data is stored directly at the declaration site or on the stack (for local variables).
  • Structures, enumerations, and tuples are value types.
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 0, y: 0)
var p2 = p1 // Creates a copy of p1
p2.x = 10

print(p1.x) // 0
print(p2.x) // 10 - p1 remains unchanged

Reference Types:

  • Assignment creates a new reference to the same data.
  • Data is stored on the heap, and the reference to it is stored at the declaration site or on the stack.
  • Classes are reference types.
class Rect {
    var width: Int
    var height: Int

    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
}

var r1 = Rect(width: 10, height: 20)
var r2 = r1 // r2 now references the same object as r1
r2.width = 30

print(r1.width) // 30 - r1 has changed because r2 references the same object
print(r2.width) // 30

Main differences in the table:

Characteristic Value Types Reference Types
Assignment Copies data Copies the reference
Data storage At declaration / on the stack On the heap (reference at declaration)
Thread safety Thread-safe by default Require synchronization for threads
Types Struct, Enum, Tuple, Array, Dict Class, Function, Closure

The choice between types depends on the task: for representing simple independent data, Value Types are preferred; for objects with shared mutable entities and inheritance, Reference Types (classes) are suitable. Using Value Types can improve performance by reducing heap load and simplifying memory management.