Sometimes you want to look at all options in a list. Enums can hold these options. CaseIterable helps you easily go through each option one by one.
You want to show all choices in a menu.
You need to check every possible state in a game.
You want to print all colors available in your app.
You want to count how many options an enum has.
Syntax
Swift
enum YourEnumName: CaseIterable {
case firstCase
case secondCase
case thirdCase
}
for item in YourEnumName.allCases {
print(item)
}
Adding CaseIterable to your enum lets you use allCases to get all cases as a collection.
You can loop over allCases with a for loop to access each case.
Examples
This example lists all four directions by looping through the enum cases.
Swift
enum Direction: CaseIterable {
case north, south, east, west
}
for direction in Direction.allCases {
print(direction)
}
This example counts how many fruits are in the enum using allCases.
Swift
enum Fruit: CaseIterable {
case apple
case banana
case cherry
}
let fruits = Fruit.allCases
print("We have \(fruits.count) fruits.")
Sample Program
This program prints all the days in the workweek by looping through the enum cases.
Swift
enum Weekday: CaseIterable {
case monday, tuesday, wednesday, thursday, friday
}
print("Days of the workweek:")
for day in Weekday.allCases {
print(day)
}
OutputSuccess
Important Notes
Only enums without associated values can use CaseIterable automatically.
You can add CaseIterable to enums with raw values too.
The order of allCases matches the order you write the cases.
Summary
CaseIterable lets you get all enum cases easily.
You use allCases to loop through every case.
This helps when you want to show or count all options in an enum.
Practice
(1/5)
1. What does the CaseIterable protocol allow you to do with an enum in Swift?
easy
A. Make enum cases private
B. Access all enum cases as a collection
C. Add stored properties to enum cases
D. Change enum cases at runtime
Solution
Step 1: Understand the purpose of CaseIterable
The CaseIterable protocol provides a way to access all cases of an enum as a collection.
Step 2: Identify what CaseIterable does not do
It does not allow changing cases, adding stored properties, or changing access levels.
Final Answer:
Access all enum cases as a collection -> Option B
Quick Check:
CaseIterable = Access all cases [OK]
Hint: Remember: CaseIterable gives you all enum cases easily [OK]
Common Mistakes:
Thinking CaseIterable allows modifying enum cases
Confusing CaseIterable with adding properties
Assuming CaseIterable changes access control
2. Which of the following is the correct way to declare an enum that supports iteration over all its cases using CaseIterable?
easy
A. enum Direction: CaseIterable { case north, south, east, west }
B. enum Direction { case north, south, east, west }
C. enum Direction: Iterable { case north, south, east, west }
D. enum Direction: CaseIterable() { case north, south, east, west }
Solution
Step 1: Check correct protocol conformance syntax
In Swift, you conform to a protocol by listing it after a colon without parentheses.
Step 2: Identify the correct protocol name
The correct protocol is CaseIterable, not Iterable, and no parentheses are used.
Final Answer:
enum Direction: CaseIterable { case north, south, east, west } -> Option A
Quick Check:
Correct syntax = enum Direction: CaseIterable { case north, south, east, west } [OK]
Hint: Use ': CaseIterable' without parentheses to conform [OK]
Common Mistakes:
Adding parentheses after CaseIterable
Using wrong protocol name like Iterable
Forgetting to conform to CaseIterable
3. Given the enum below, what will be printed by the code?
enum Fruit: CaseIterable {
case apple, banana, cherry
}
for fruit in Fruit.allCases {
print(fruit)
}
medium
A. apple banana cherry
B. ["apple", "banana", "cherry"]
C. apple
banana
cherry
D. Fruit.apple Fruit.banana Fruit.cherry
Solution
Step 1: Understand the for loop over allCases
The loop iterates over each case in the enum and prints it on a new line.
Step 2: Recognize print behavior in Swift
Each call to print outputs the case name followed by a newline.
Final Answer:
apple
banana
cherry -> Option C
Quick Check:
Loop prints each case on separate lines [OK]
Hint: print() adds new line after each output [OK]
Common Mistakes:
Assuming all cases print on one line
Expecting array output instead of separate lines
Confusing enum case names with full type names
4. What is wrong with this code snippet?
enum Color: CaseIterable {
case red, green, blue
}
for color in Color {
print(color)
}
medium
A. The enum cases must be strings
B. The enum must be a class to iterate
C. CaseIterable requires a raw value type
D. You must use Color.allCases to iterate, not Color directly
Solution
Step 1: Identify how to iterate over enum cases
You cannot iterate over the enum type itself; you must use allCases property.
Step 2: Understand CaseIterable usage
CaseIterable provides allCases which returns a collection of all enum cases for iteration.
Final Answer:
You must use Color.allCases to iterate, not Color directly -> Option D
Quick Check:
Use allCases for iteration [OK]
Hint: Always loop over Enum.allCases, not Enum itself [OK]
Common Mistakes:
Trying to loop over enum type directly
Thinking CaseIterable needs raw values
Assuming enum must be a class
5. You want to create a menu that lists all payment methods defined in this enum:
enum PaymentMethod: CaseIterable {
case cash, creditCard, paypal, applePay
}
Which code snippet correctly prints each payment method with a number starting from 1?
hard
A. for (index, method) in PaymentMethod.allCases.enumerated() {
print("\(index + 1). \(method)")
}
B. for method in PaymentMethod.allCases {
print("\(method + 1). \(method)")
}
C. for index in 1...PaymentMethod.allCases.count {
print("\(index). \(PaymentMethod.allCases[index])")
}
D. for method in PaymentMethod {
print("\(method.rawValue + 1). \(method)")
}
Solution
Step 1: Use enumerated() to get index and value
The enumerated() method returns pairs of (index, element) for the collection.
Step 2: Adjust index to start from 1 and print
Since enumerated indexes start at 0, add 1 to show numbering from 1.
Final Answer:
for (index, method) in PaymentMethod.allCases.enumerated() {
print("\(index + 1). \(method)")
} -> Option A
Quick Check:
Use enumerated() + index+1 for numbering [OK]
Hint: Use enumerated() and add 1 to index for numbering [OK]
Common Mistakes:
Trying to add 1 directly to enum case
Indexing allCases with 1-based index (off by one)
Looping over enum type instead of allCases
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.