Browse Questions
Answer:
Classic OOP assumes objects are reference types with identity and shared mutable state. Swift's struct/enum value types break that assumption: copies are independent, there's no shared mutable state to corrupt, and "object identity" doesn't apply. This pushes Swift OOP toward composition and protocols over inheritance, since value types can't be subclassed.
struct Point { // value type — copied on assignment
var x, y: Double
}
var a = Point(x: 0, y: 0)
var b = a
b.x = 10
// a.x is still 0 — independent copies, no aliasing bugs
class Counter { // reference type — shared identity
var count = 0
}
let c1 = Counter()
let c2 = c1
c2.count = 10
// c1.count is also 10 — same instance
Rule of thumb: reach for struct (value semantics, thread-safe copies, no inheritance) by default, and use class when you specifically need shared, mutable identity (e.g., view controllers, caches, observable state).