📖 Scenario: You work at a bookstore that organizes books by genre. Each genre has a list of book titles. You want to create a single list of all book titles from all genres.
🎯 Goal: Build a Swift program that uses flatMap to combine nested lists of book titles into one flat list.
📋 What You'll Learn
Create a dictionary called booksByGenre with genres as keys and arrays of book titles as values
Create a variable called allBooks that uses flatMap on booksByGenre.values to get a single array of all book titles
Print the allBooks array
💡 Why This Matters
🌍 Real World
Combining nested lists of items is common when working with grouped data, like categories of products or genres of books.
💼 Career
Understanding how to flatten nested collections helps in data processing tasks, making it easier to analyze or display combined information.
Progress0 / 4 steps
1
Create the nested dictionary of books
Create a dictionary called booksByGenre with these exact entries: "Fiction": ["The Alchemist", "1984"], "Science": ["A Brief History of Time", "The Selfish Gene"], and "History": ["Sapiens", "Guns, Germs, and Steel"].
Swift
Hint
Use a Swift dictionary with String keys and array of String values.
2
Prepare to flatten the nested arrays
Create a variable called allBooks and set it to an empty array of strings [] to prepare for collecting all book titles.
Swift
Hint
Declare allBooks as a variable array of strings starting empty.
3
Use flatMap to combine all book lists
Set the variable allBooks to the result of using flatMap on booksByGenre.values to combine all nested arrays into one flat array.
Swift
Hint
Use flatMap on booksByGenre.values with closure { $0 } to flatten.
4
Print the combined list of all books
Write a print statement to display the allBooks array.
Swift
Hint
Use print(allBooks) to show the combined list.
Practice
(1/5)
1. What does the flatMap function do when applied to a nested array in Swift?
easy
A. It flattens the nested arrays into a single array by combining all elements.
B. It sorts the nested arrays in ascending order.
C. It removes duplicate elements from the nested arrays.
D. It converts the nested arrays into a dictionary.
Solution
Step 1: Understand the purpose of flatMap
The flatMap function is designed to take a collection of collections and combine them into one single collection by flattening the nested structure.
Step 2: Identify the effect on nested arrays
When applied to nested arrays, flatMap merges all inner arrays into one continuous array containing all elements.
Final Answer:
It flattens the nested arrays into a single array by combining all elements. -> Option A
Quick Check:
flatMap flattens nested arrays = A [OK]
Hint: Remember: flatMap flattens nested arrays into one array [OK]
Common Mistakes:
Thinking flatMap sorts the array
Confusing flatMap with removing duplicates
Assuming flatMap converts arrays to dictionaries
2. Which of the following is the correct syntax to flatten a nested array let nested = [[1, 2], [3, 4]] using flatMap in Swift?
easy
A. let flat = nested.flatten()
B. let flat = nested.map { $0 }
C. let flat = nested.flatMap()
D. let flat = nested.flatMap { $0 }
Solution
Step 1: Recall flatMap syntax
The correct syntax for flattening nested arrays uses flatMap with a closure that returns each inner array: nested.flatMap { $0 }.
Step 2: Evaluate each option
let flat = nested.flatMap { $0 } uses the correct closure syntax. let flat = nested.map { $0 } uses map which does not flatten. let flat = nested.flatMap() is invalid syntax. let flat = nested.flatten() uses a non-existent method flatten().
Final Answer:
let flat = nested.flatMap { $0 } -> Option D
Quick Check:
flatMap with closure { $0 } flattens nested arrays [OK]
Hint: Use flatMap with closure { $0 } to flatten nested arrays [OK]
Common Mistakes:
Using map instead of flatMap
Calling flatMap without closure
Using non-existent flatten() method
3. What is the output of the following Swift code?
let nested = [[1, 2], [3, 4], [5]]
let result = nested.flatMap { $0.map { $0 * 2 } }
print(result)
medium
A. [1, 2, 3, 4, 5]
B. [2, 4, 6, 8, 10]
C. [[2, 4], [6, 8], [10]]
D. [1, 4, 9, 16, 25]
Solution
Step 1: Understand the inner map operation
Each inner array is mapped to a new array where each element is multiplied by 2, so [1,2] becomes [2,4], [3,4] becomes [6,8], and [5] becomes [10].
Step 2: Apply flatMap to flatten the mapped arrays
The flatMap then flattens these arrays into a single array: [2, 4, 6, 8, 10].
Final Answer:
[2, 4, 6, 8, 10] -> Option B
Quick Check:
flatMap + map doubles and flattens = [2,4,6,8,10] [OK]
Hint: flatMap flattens after map transforms inner elements [OK]
Common Mistakes:
Confusing flatMap with map output
Expecting nested arrays instead of flattened
Multiplying elements incorrectly
4. Identify the error in the following Swift code that attempts to flatten a nested array:
let nested = [["a", "b"], ["c"]]
let flat = nested.flatMap()
print(flat)
medium
A. flatMap requires a closure to specify how to flatten the nested arrays.
B. flatMap cannot be used on arrays of strings.
C. The variable 'flat' is immutable and cannot be assigned.
D. The print statement syntax is incorrect.
Solution
Step 1: Check flatMap usage
The flatMap function requires a closure to specify how to flatten the nested arrays, such as { $0 }. Calling flatMap() without arguments is invalid.
Step 2: Verify other parts of the code
Arrays of strings can be flattened with flatMap, variables can be assigned with let, and print syntax is correct.
Final Answer:
flatMap requires a closure to specify how to flatten the nested arrays. -> Option A
Quick Check:
flatMap needs closure { $0 } to flatten [OK]
Hint: Always provide closure { $0 } when using flatMap on nested arrays [OK]
Common Mistakes:
Calling flatMap without closure
Thinking flatMap can't flatten strings
Misunderstanding let variable assignment
Assuming print syntax is wrong
5. Given a nested array of optional integers let nested: [[Int?]] = [[1, nil], [3, 4], [nil]], which Swift code using flatMap correctly produces a flat array of non-nil integers?
hard
A. let flat = nested.flatMap { $0.filter { $0 != nil } }
B. let flat = nested.flatMap { $0.map { $0! } }
C. let flat = nested.flatMap { $0.compactMap { $0 } }
D. let flat = nested.flatMap { $0 }
Solution
Step 1: Understand the data and goal
The nested array contains optional integers, some are nil. The goal is to flatten and remove nil values, keeping only non-nil integers.
Step 2: Analyze each option
let flat = nested.flatMap { $0.compactMap { $0 } } uses compactMap inside flatMap to unwrap and remove nils, then flatten. let flat = nested.flatMap { $0.map { $0! } } force unwraps which can crash if nil exists. let flat = nested.flatMap { $0.filter { $0 != nil } } filters nil but keeps optionals, so result is nested optionals. let flat = nested.flatMap { $0 } just flattens but keeps nils.
Final Answer:
let flat = nested.flatMap { $0.compactMap { $0 } } -> Option C
Quick Check:
flatMap + compactMap unwraps and flattens non-nil values [OK]
Hint: Use compactMap inside flatMap to remove nils and flatten [OK]
Common Mistakes:
Force unwrapping optionals causing runtime errors
Filtering nil but not unwrapping optionals
Flattening without removing nil values
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.