What if two things look the same but are actually different? Identity comparison reveals the truth!
Why Identity comparison (===) in Swift? - Purpose & Use Cases
Imagine you have two boxes that look the same and contain the same toys. You want to check if they are actually the same box, not just two boxes with the same toys.
Checking if two boxes are the same by comparing their contents can be confusing and slow. You might think they are the same because the toys match, but they could be different boxes. This can cause mistakes in your program.
Using identity comparison (===) in Swift lets you quickly check if two variables point to the exact same object in memory, like checking if two labels point to the same box, not just if the boxes look alike.
if box1 == box2 { print("Boxes look the same") }
if box1 === box2 { print("Boxes are exactly the same") }
This lets you avoid confusion and bugs by clearly knowing when two references point to the exact same object.
When managing user profiles in an app, identity comparison helps you know if two profile variables actually refer to the same user data, preventing accidental changes to the wrong profile.
Manual content comparison can be misleading.
Identity comparison (===) checks if two references point to the same object.
This prevents bugs and makes your code clearer.
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
