The Identifiable protocol in Swift helps uniquely identify data items, especially useful in lists. It allows SwiftUI and other frameworks to track and update UI elements efficiently by knowing which item is which.
Widget Tree
List
└── ForEach
└── Text
The root is a List that displays multiple rows. Inside the List, a ForEach iterates over an array of identifiable items. Each item is shown using a Text view displaying the item's name.
Render Trace - 3 Steps
Step 1: List
Step 2: ForEach
Step 3: Text
State Change - Re-render
Trigger:Adding a new item to the identifiable items array
Before
Array has 3 items with unique ids
→
After
Array has 4 items with unique ids
Re-renders:Only the new row for the added item is rendered; existing rows remain unchanged
UI Quiz - 3 Questions
Test your understanding
Why does SwiftUI require items to conform to Identifiable in a ForEach?
ATo sort the items alphabetically
BTo uniquely track each item for efficient UI updates
CTo change the font of the text
DTo add animations automatically
Key Insight
Using the Identifiable protocol allows SwiftUI to efficiently update only the changed parts of a list, improving performance and user experience by avoiding unnecessary redraws.
Practice
(1/5)
1.
What is the main purpose of the Identifiable protocol in Swift?
easy
A. To enforce a specific initializer
B. To make a class inherit from another class
C. To add default methods to a struct
D. To require a unique id property for each instance
Solution
Step 1: Understand the Identifiable protocol
The Identifiable protocol requires that a type has a unique id property.
Step 2: Identify the purpose of the id
This unique id helps SwiftUI distinguish between different instances, especially in lists.
Final Answer:
To require a unique id property for each instance -> Option D
Quick Check:
Identifiable = unique id required [OK]
Hint: Identifiable means each item must have a unique id [OK]
Common Mistakes:
Thinking it adds methods instead of requiring an id
Confusing it with inheritance
Assuming it enforces initializers
2.
Which of the following is the correct way to declare a struct conforming to Identifiable with a constant id of type UUID?
struct Item: Identifiable {
// Fill in the blank
}
easy
A. let id: UUID = UUID()
B. var id: UUID
C. var id = UUID()
D. func id() -> UUID
Solution
Step 1: Check property declaration for id
The id must be a property, not a function.
Step 2: Choose correct syntax with initialization
Using let id: UUID = UUID() declares a constant id initialized with a new UUID, which is correct.
Final Answer:
let id: UUID = UUID() -> Option A
Quick Check:
Property with UUID value, not function [OK]
Hint: id must be a property, not a function [OK]
Common Mistakes:
Declaring id as a function
Not initializing id
Using var without initialization
3.
Given the code below, what will be printed?
struct User: Identifiable {
let id: Int
let name: String
}
let users = [User(id: 1, name: "Anna"), User(id: 2, name: "Ben")]
print(users[1].id)
medium
A. 1
B. Anna
C. 2
D. Ben
Solution
Step 1: Identify the second user in the array
Index 1 refers to the second element, which is User(id: 2, name: "Ben").
Step 2: Access the id property
The id of this user is 2, so print(users[1].id) prints 2.
Final Answer:
2 -> Option C
Quick Check:
Second user's id = 2 [OK]
Hint: Array index 1 is second element, check its id [OK]
Common Mistakes:
Confusing index 0 and 1
Printing name instead of id
Assuming id is name
4.
What is wrong with this struct conforming to Identifiable?
struct Product: Identifiable {
let name: String
}
medium
A. Missing id property required by Identifiable
B. The name property should be var, not let
C. Structs cannot conform to protocols
D. The struct must inherit from a class
Solution
Step 1: Check protocol requirements
The Identifiable protocol requires a unique id property.
Step 2: Verify struct properties
This struct only has name, no id property is declared.
Final Answer:
Missing id property required by Identifiable -> Option A
Quick Check:
Identifiable needs id property [OK]
Hint: Identifiable always needs an id property [OK]
Common Mistakes:
Thinking name property suffices
Believing structs can't conform to protocols
Assuming var vs let matters here
5.
You want to create a list of tasks where each task has a unique string identifier. Which of the following struct definitions correctly conforms to Identifiable and uses a string id?
struct Task: Identifiable {
let id: String
let title: String
init(title: String) {
// Fill in the blank
}
}
hard
A. self.title = title
self.id = title
B. self.title = title
self.id = UUID().uuidString
C. self.title = title
self.id = String()
D. self.title = title
self.id = nil
Solution
Step 1: Understand the need for unique string id
The id must be unique for each task and of type String.
Step 2: Check each option for uniqueness and type
self.title = title
self.id = UUID().uuidString uses UUID().uuidString which generates a unique string each time, fulfilling the requirement.
Final Answer:
self.title = title
self.id = UUID().uuidString -> Option B
Quick Check:
Unique string id = UUID().uuidString [OK]
Hint: Use UUID().uuidString for unique string ids [OK]
Common Mistakes:
Using title as id which may not be unique
Assigning empty string as id
Setting id to nil which is invalid
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.