Bird
Raised Fist0
Swiftprogramming~10 mins

Equatable, Hashable, Comparable protocols in Swift - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Equatable, Hashable, Comparable protocols
Start
↓
Define struct with protocols
↓
Implement Equatable: ==
↓
Implement Hashable: hash(into:)
↓
Implement Comparable: <
↓
Use instances in collections or compare
↓
End
This flow shows how a Swift struct adopts Equatable, Hashable, and Comparable by implementing required methods, then uses instances for equality, hashing, and ordering.
Execution Sample
Swift
struct Person: Equatable, Hashable, Comparable {
    let name: String
    let age: Int

    static func == (lhs: Person, rhs: Person) -> Bool {
        lhs.name == rhs.name && lhs.age == rhs.age
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
        hasher.combine(age)
    }

    static func < (lhs: Person, rhs: Person) -> Bool {
        lhs.age < rhs.age
    }
}

let p1 = Person(name: "Alice", age: 30)
let p2 = Person(name: "Bob", age: 25)
print(p1 == p2)
print(p1 < p2)
Defines a Person struct that can be compared for equality, hashed, and ordered by age, then compares two instances.
Execution Table
StepActionEvaluationResult
1Create p1Person(name: "Alice", age: 30)p1 = Person(name: "Alice", age: 30)
2Create p2Person(name: "Bob", age: 25)p2 = Person(name: "Bob", age: 25)
3Check p1 == p2p1.name == p2.name && p1.age == p2.agefalse ("Alice" != "Bob")
4Check p1 < p2p1.age < p2.agefalse (30 < 25 is false)
5Hash p1Combine name and agehash value computed
6Hash p2Combine name and agehash value computed
7EndNo more actionsProgram ends
💡 All comparisons and hashing done; program ends.
Variable Tracker
VariableStartAfter Step 1After Step 2Final
p1nilPerson(name: "Alice", age: 30)Person(name: "Alice", age: 30)Person(name: "Alice", age: 30)
p2nilnilPerson(name: "Bob", age: 25)Person(name: "Bob", age: 25)
Key Moments - 3 Insights
Why does p1 == p2 return false even if they are both Person?
Because the == operator compares both name and age (see step 3 in execution_table). Since names differ, the result is false.
How does the < operator decide which Person is smaller?
It compares the age property only (step 4). p1.age is 30, p2.age is 25, so p1 < p2 is false.
Why do we need to implement hash(into:) when conforming to Hashable?
Because hashing combines properties to create a unique hash value for collections like sets or dictionaries (steps 5 and 6).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the result of p1 == p2 at step 3?
Afalse
Btrue
Cerror
Dnil
💡 Hint
Check the 'Result' column in row for step 3 in execution_table.
At which step is the hash value for p2 computed?
AStep 4
BStep 5
CStep 6
DStep 7
💡 Hint
Look for 'Hash p2' action in execution_table.
If p1.age was 20 instead of 30, what would be the result of p1 < p2 at step 4?
Aerror
Btrue
Cfalse
Dnil
💡 Hint
Compare ages in step 4; if p1.age < p2.age, < returns true.
Concept Snapshot
Equatable: implement static func == to compare equality.
Hashable: implement func hash(into:) to provide hash value.
Comparable: implement static func < to define order.
Use these to compare, hash, and sort your types easily.
Full Transcript
This example shows a Swift struct Person that adopts Equatable, Hashable, and Comparable protocols. It implements the required methods: == to check if two persons have the same name and age, hash(into:) to combine name and age into a hash value, and < to compare persons by age. Two instances p1 and p2 are created with different names and ages. The program compares them for equality and order, showing false for both because their names and ages differ. Hash values are computed for both. This demonstrates how these protocols let you compare, hash, and sort custom types in Swift.

Practice

(1/5)
1.

Which protocol in Swift allows you to check if two instances of a type are equal using ==?

easy
A. Hashable
B. Codable
C. Comparable
D. Equatable

Solution

  1. Step 1: Understand the purpose of Equatable

    Equatable protocol allows comparing two instances for equality using ==.
  2. Step 2: Compare with other protocols

    Hashable is for hashing, Comparable is for ordering, Codable is for encoding/decoding.
  3. Final Answer:

    Equatable -> Option D
  4. Quick Check:

    Equality check = Equatable [OK]
Hint: Equality means Equatable protocol [OK]
Common Mistakes:
  • Confusing Hashable with Equatable
  • Thinking Comparable checks equality
  • Mixing Codable with Equatable
2.

Which of the following is the correct way to declare a struct Person that conforms to Equatable and Hashable?

struct Person: ??? {
    var name: String
    var age: Int
}
easy
A. Equatable, Hashable
B. Comparable, Hashable
C. Equatable, Comparable
D. Codable, Hashable

Solution

  1. Step 1: Identify needed protocols

    To compare equality and use in sets/dictionaries, use Equatable and Hashable.
  2. Step 2: Check syntax for protocol conformance

    Protocols are listed separated by commas after colon in struct declaration.
  3. Final Answer:

    Equatable, Hashable -> Option A
  4. Quick Check:

    Equality + hashing = Equatable, Hashable [OK]
Hint: List protocols comma-separated after colon [OK]
Common Mistakes:
  • Using Comparable instead of Equatable
  • Forgetting commas between protocols
  • Using Codable instead of Equatable
3.

What will be the output of the following Swift code?

struct Item: Comparable {
    var value: Int
    static func < (lhs: Item, rhs: Item) -> Bool {
        return lhs.value < rhs.value
    }
}

let items = [Item(value: 3), Item(value: 1), Item(value: 2)]
let sortedValues = items.sorted().map { $0.value }
print(sortedValues)
medium
A. [3, 2, 1]
B. [1, 2, 3]
C. [2, 3, 1]
D. Compilation error

Solution

  1. Step 1: Understand Comparable conformance

    The < operator compares value properties to sort ascending.
  2. Step 2: Analyze sorting and mapping

    Sorting the array orders items by value: 1, 2, 3. Mapping extracts values in this order.
  3. Final Answer:

    [1, 2, 3] -> Option B
  4. Quick Check:

    Sorted values ascending = [1, 2, 3] [OK]
Hint: Comparable sorts ascending by < operator [OK]
Common Mistakes:
  • Assuming descending order by default
  • Confusing map output with original array
  • Forgetting to implement < operator
4.

Identify the error in this Swift struct that tries to conform to Hashable:

struct Book: Hashable {
    var title: String
    var pages: Int

    func hash(into hasher: inout Hasher) {
        hasher.combine(title)
    }
}
medium
A. Missing combine call for all properties in hash(into:)
B. Struct cannot conform to Hashable without Codable
C. Incorrect method signature for hash(into:)
D. Missing == operator implementation for Equatable

Solution

  1. Step 1: Check Hashable requirements

    Hashable requires hashing all properties that affect equality.
  2. Step 2: Analyze hash(into:) implementation

    Only title is combined; pages is missing, causing incorrect hashing.
  3. Final Answer:

    Missing combine call for all properties in hash(into:) -> Option A
  4. Quick Check:

    Hash all relevant properties [OK]
Hint: Hash all properties used in equality [OK]
Common Mistakes:
  • Hashing only some properties
  • Forgetting to implement == operator if needed
  • Wrong method signature for hash(into:)
5.

You want to create a struct Player that can be stored in a Set, compared for equality, and sorted by score descending. Which protocols should Player conform to, and how should you implement the sorting?

hard
A. Conform to Equatable and Hashable; implement < to compare scores descending
B. Conform to Comparable only; implement < to compare scores ascending
C. Conform to Equatable, Hashable, Comparable; implement < to compare scores descending
D. Conform to Hashable only; sorting is automatic

Solution

  1. Step 1: Identify needed protocols

    To store in Set and check equality, conform to Equatable and Hashable. To sort, conform to Comparable.
  2. Step 2: Implement sorting logic

    Implement < operator to compare scores descending by reversing comparison.
  3. Final Answer:

    Conform to Equatable, Hashable, Comparable; implement < for descending scores -> Option C
  4. Quick Check:

    Set + equality + custom sort = Equatable, Hashable, Comparable [OK]
Hint: Use all three protocols; reverse < for descending sort [OK]
Common Mistakes:
  • Forgetting Comparable for sorting
  • Sorting ascending instead of descending
  • Missing Equatable or Hashable for Set storage
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard