Classes are reference types in Swift - Time & Space Complexity
When working with classes in Swift, it's important to understand how operations on them grow as the program runs.
We want to see how the time to copy or assign class instances changes as we work with more objects.
Analyze the time complexity of the following code snippet.
class Person {
var name: String
init(name: String) {
self.name = name
}
}
var person1 = Person(name: "Alice")
var person2 = person1
person2.name = "Bob"
This code creates a class instance and assigns it to another variable, then changes a property.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Assigning a reference from one variable to another.
- How many times: Happens once here, no loops or repeated traversals.
Since assignment copies only the reference, the time does not grow with the number of objects.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1 |
| 100 | 1 |
| 1000 | 1 |
Pattern observation: The operation takes the same time regardless of how many objects exist.
Time Complexity: O(1)
This means assigning or copying a class instance reference takes the same small amount of time no matter how many objects there are.
[X] Wrong: "Copying a class variable duplicates the whole object and takes longer with bigger objects."
[OK] Correct: Actually, copying a class variable just copies the reference, not the whole object, so it takes constant time.
Understanding how classes work as references helps you explain memory use and performance clearly, a useful skill in many coding discussions.
"What if we changed the class to a struct? How would the time complexity of copying change?"
Practice
Solution
Step 1: Understand class assignment behavior
In Swift, classes are reference types, so assigning one instance to another variable copies the reference, not the object.Step 2: Effect of assignment on variables
Both variables point to the same memory location, so changes via one variable affect the other.Final Answer:
Both variables refer to the same object in memory. -> Option BQuick Check:
Classes are reference types = A [OK]
- Thinking a new object is created on assignment
- Confusing classes with structs (value types)
- Assuming variables become constants automatically
Solution
Step 1: Identify correct class syntax
In Swift, a class is declared using the keyword 'class' followed by the class name and curly braces containing properties.Step 2: Check each option
class Dog { var name: String } correctly declares a class with a property. struct Dog { var name: String } declares a struct, not a class. class Dog: String { var name } has invalid syntax with inheritance from String and missing property type. func Dog() { var name: String } uses 'func' which is for functions, not classes.Final Answer:
class Dog { var name: String } -> Option CQuick Check:
Correct class syntax = A [OK]
- Using 'struct' instead of 'class'
- Incorrect inheritance syntax
- Using 'func' instead of 'class'
class Counter {
var count = 0
}
let a = Counter()
let b = a
b.count = 5
print(a.count)Solution
Step 1: Understand reference assignment
Variable 'b' is assigned to 'a', so both refer to the same Counter instance.Step 2: Effect of changing 'b.count'
Changing 'b.count' to 5 changes the shared object's property, so 'a.count' also becomes 5.Final Answer:
5 -> Option DQuick Check:
Class references share data = 5 [OK]
- Assuming 'a.count' stays 0 after changing 'b.count'
- Expecting a compilation error
- Confusing with value type behavior
class Person {
var name: String
}
let p1 = Person()
p1.name = "Alice"Solution
Step 1: Check class property initialization
The class Person has a non-optional property 'name' without an initial value or initializer.Step 2: Understand Swift's requirement for property initialization
Swift requires all non-optional properties to be initialized before use, either with a default value or in an initializer.Final Answer:
Missing initializer for 'name' property in class Person. -> Option AQuick Check:
Non-optional properties need initialization = C [OK]
- Thinking 'let' prevents property assignment
- Assuming classes can't be instantiated with 'let'
- Ignoring property initialization rules
Solution
Step 1: Understand shared mutable state with classes
Classes are reference types, so a single instance shared by multiple parts allows changes to be seen everywhere.Step 2: Evaluate options for shared settings
Create a single instance of a Settings class and pass its reference around. uses one shared instance, which fits the requirement. Create multiple instances of a Settings struct and copy them as needed. uses structs (value types), so copies won't reflect changes. Use global variables instead of classes for shared data. uses globals, which is not recommended for maintainability. Use a function that returns a new Settings object every time. creates new objects each time, so no shared state.Final Answer:
Create a single instance of a Settings class and pass its reference around. -> Option AQuick Check:
Shared mutable object = B [OK]
- Using structs which copy data instead of sharing
- Relying on global variables for sharing
- Creating new instances instead of sharing one
Ready to prove it?
Pass the test and this pattern moves unknown
