Identity operators check if two variables point to the exact same object in memory. They help you know if two references are identical, not just equal.
Identity operators (=== and !==) in Swift
object1 === object2 object1 !== object2
Use === to check if two references point to the same object.
Use !== to check if two references point to different objects.
=== returns true. personC is a different object.class Person {} let personA = Person() let personB = personA let personC = Person() print(personA === personB) // true print(personA === personC) // false
!== returns true and prints the message.class Car {} let car1 = Car() let car2 = Car() if car1 !== car2 { print("Different cars") }
This program creates three book references. book1 and book2 point to the same object, so === is true. book3 is a different object with the same content, so === is false and !== is true.
class Book { let title: String init(title: String) { self.title = title } } let book1 = Book(title: "Swift Basics") let book2 = book1 let book3 = Book(title: "Swift Basics") print(book1 === book2) // true print(book1 === book3) // false print(book1 !== book3) // true
Identity operators only work with class instances, not with structs or enums.
Use equality operators (==) to compare values, identity operators (===) to compare references.
=== checks if two references point to the same object.
!== checks if two references point to different objects.
Use identity operators only with class instances, not value types.
Practice
=== check in Swift?Solution
Step 1: Understand the purpose of
The======operator checks if two references point to the same object in memory.Step 2: Differentiate from value equality
Unlike==, which checks value equality,===checks identity (same instance).Final Answer:
If two variables refer to the exact same class instance -> Option CQuick Check:
===checks identity [OK]
- Confusing === with == for value equality
- Using === with structs or value types
- Thinking === checks type equality
a and b are NOT the same object in Swift?Solution
Step 1: Identify the correct identity operator for inequality
The operator to check if two references are NOT the same object is!==.Step 2: Verify syntax correctness
Options C and D have invalid operators. if a != b uses!=which checks value inequality, not identity.Final Answer:
if a !== b -> Option DQuick Check:
Use !== for identity inequality [OK]
- Using != instead of !== for identity check
- Typing invalid operators like !=== or !====
- Confusing identity operators with value operators
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 the references
p2is assigned top1, so both point to the same object.p3is a new instance.Step 2: Evaluate identity comparisons
p1 === p2is true because they are the same instance.p1 === p3is false because they are different instances.Final Answer:
true\nfalse -> Option AQuick Check:
Same instance = true, different instance = false [OK]
- Assuming p1 and p3 are same because same class
- Confusing value equality with identity
- Forgetting p2 points to p1's instance
struct Point {
var x: Int
var y: Int
}
let p1 = Point(x: 1, y: 2)
let p2 = Point(x: 1, y: 2)
if p1 === p2 {
print("Same point")
}Solution
Step 1: Identify the types used
Pointis a struct, which is a value type in Swift.Step 2: Understand identity operator restrictions
Identity operators===and!==only work with class instances (reference types), not value types like structs.Final Answer:
Cannot use === with structs because they are value types -> Option BQuick Check:
=== only for class instances [OK]
- Trying to use === with value types
- Assuming structs have identity
- Ignoring compiler error message
Car and an array of Car instances. You want to find if a specific Car instance myCar is already in the array by identity (same object), not by value. Which Swift code correctly checks this?Solution
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 cars.contains(where: { $0 === myCar }) { print("Found") } uses===correctly. Options B and C use==orof:which check value equality or require Equatable conformance. if cars.filter({ $0 == myCar }).count > 0 { print("Found") } uses==which is value equality.Final Answer:
if cars.contains(where: { $0 === myCar }) { print("Found") } -> Option AQuick Check:
Use contains(where:) with === for identity [OK]
- Using contains(myCar) which checks value equality
- Assuming == checks identity
- Not using closure for identity check
Ready to prove it?
Pass the test and this pattern moves unknown
