Identity comparison (===) in Swift - Time & Space Complexity
We want to understand how fast identity comparison works in Swift.
Specifically, how the cost changes when we compare objects using the identity operator ===.
Analyze the time complexity of the following code snippet.
class Person {}
let people = [Person(), Person(), Person(), Person(), Person()]
for i in 0..
This code checks each person in the array to see if it is the same object as the first person.
Look for repeated actions that take time.
- Primary operation: The identity comparison
===inside the loop. - How many times: It runs once for each person in the array.
As the number of people grows, the number of comparisons grows the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 comparisons |
| 100 | 100 comparisons |
| 1000 | 1000 comparisons |
Pattern observation: The number of comparisons grows directly with the number of items.
Time Complexity: O(n)
This means the time to finish grows in a straight line as the list gets bigger.
[X] Wrong: "Identity comparison === is instant and does not depend on the number of items."
[OK] Correct: While each comparison is quick, doing many comparisons adds up, so total time depends on how many times you compare.
Understanding how identity checks scale helps you explain performance when working with object references in Swift.
What if we stopped the loop early when we find the first match? How would the time complexity change?
Practice
=== operator check in Swift?Solution
Step 1: Understand the purpose of
The======operator in Swift is used to check if two references point to the exact same object in memory.Step 2: Differentiate from value equality
Unlike==, which checks if values are equal,===checks identity, meaning the same instance.Final Answer:
If two variables refer to the exact same object instance -> Option AQuick Check:
Identity comparison = If two variables refer to the exact same object instance [OK]
- Confusing === with == for value equality
- Thinking === checks type equality
- Assuming === works with structs or enums
a and b are identical in Swift?Solution
Step 1: Recall identity operator syntax
In Swift, the identity operator to check if two references point to the same object is===.Step 2: Identify correct usage
The correct syntax isif a === b { }. The other options are either value equality, assignment, or invalid syntax.Final Answer:
if a === b { } -> Option AQuick Check:
Identity check syntax = if a === b { } [OK]
- Using == instead of === for identity
- Using single = which is assignment
- Typing invalid operators like ===
class Person {}
let p1 = Person()
let p2 = p1
let p3 = Person()
print(p1 === p2)
print(p1 === p3)What will be the output?
Solution
Step 1: Analyze object references
Variablep2is assigned top1, so both point to the same object.p3is a new instance.Step 2: Evaluate identity comparisons
p1 === p2istruebecause they are the same instance.p1 === p3isfalsebecause they are different instances.Final Answer:
true\nfalse -> Option DQuick Check:
Same instance = true, different instance = false [OK]
- Assuming different variables always mean false
- Confusing === with == and expecting value equality
- Ignoring that p2 points to p1's instance
class Car {}
let car1 = Car()
let car2 = Car()
if car1 == car2 {
print("Same car")
}Solution
Step 1: Understand == operator requirements
By default, class instances cannot be compared with==unless the class conforms toEquatable.Step 2: Identify the error cause
The code tries to use==withoutCarconforming toEquatable, causing a compile error.Final Answer:
Cannot use == to compare class instances without Equatable conformance -> Option CQuick Check:
== needs Equatable for classes [OK]
- Thinking === causes error here
- Assuming == works automatically for classes
- Ignoring Equatable protocol requirement
newObj is already stored in the cache by identity. Which Swift code correctly checks this?class Data {}
var cache: [String: Data] = [:]
let newObj = Data()
// Check if newObj is already in cache by identitySolution
Step 1: Understand identity check in collections
To check if an instance exists by identity, use===inside a closure withcontains(where:).Step 2: Analyze options
if cache.values.contains(where: { $0 === newObj }) { print("Found") } correctly usescache.values.contains(where: { $0 === newObj }). if cache.values.contains(newObj) { print("Found") } usescontainswithout identity check, which requires Equatable. if cache.keys.contains(where: { $0 === newObj }) { print("Found") } incorrectly checks keys (strings) with identity. if cache.values.contains(where: { $0 == newObj }) { print("Found") } uses==which needs Equatable.Final Answer:
if cache.values.contains(where: { $0 === newObj }) { print("Found") } -> Option BQuick Check:
Use contains(where:) with === for identity [OK]
- Using contains without where and identity check
- Checking keys instead of values
- Using == without Equatable conformance
Ready to prove it?
Pass the test and this pattern moves unknown
