📖 Scenario: You are managing a small library's book database. The library wants to keep track of books and quickly find books by their genre or author. Using collection algorithms helps organize and retrieve this information efficiently.
🎯 Goal: Build a simple Swift dictionary to store books with their genres, add a filter condition to select books of a specific genre, and then retrieve the filtered list.
📋 What You'll Learn
Create a dictionary called books with these exact entries: "1984": "Dystopian", "To Kill a Mockingbird": "Classic", "The Hobbit": "Fantasy", "Fahrenheit 451": "Dystopian"
Create a variable called selectedGenre and set it to "Dystopian"
Use the filter method on books to create a new dictionary called filteredBooks that contains only books where the genre matches selectedGenre
Add a final line that creates an array called filteredTitles containing only the titles (keys) from filteredBooks
💡 Why This Matters
🌍 Real World
Libraries, bookstores, and many apps use collection algorithms to organize and find data quickly.
💼 Career
Understanding how to filter and manipulate collections is essential for software developers working with databases and user data.
Progress0 / 4 steps
1
Create the books dictionary
Create a dictionary called books with these exact entries: "1984": "Dystopian", "To Kill a Mockingbird": "Classic", "The Hobbit": "Fantasy", "Fahrenheit 451": "Dystopian"
Swift
Hint
Use a Swift dictionary literal with keys as book titles and values as genres.
2
Set the selected genre
Create a variable called selectedGenre and set it to "Dystopian"
Swift
Hint
Use let to create a constant string variable.
3
Filter books by genre
Use the filter method on books to create a new dictionary called filteredBooks that contains only books where the genre matches selectedGenre
Swift
Hint
Use filter with a closure that checks if the value equals selectedGenre.
4
Extract filtered book titles
Add a final line that creates an array called filteredTitles containing only the titles (keys) from filteredBooks
Swift
Hint
Use filteredBooks.keys and convert it to an array.
Practice
(1/5)
1. Why are collection algorithms important when working with data in Swift?
easy
A. They help find, sort, and filter data easily and efficiently.
B. They make the app run slower by adding extra steps.
C. They only work with numbers, not text or objects.
D. They require complex code that is hard to read.
Solution
Step 1: Understand the purpose of collection algorithms
Collection algorithms are designed to help manage data by finding, sorting, filtering, and checking items quickly.
Step 2: Evaluate the options based on this purpose
They help find, sort, and filter data easily and efficiently. correctly states their role in making data handling easier and efficient. Other options describe incorrect or negative effects.
Final Answer:
They help find, sort, and filter data easily and efficiently. -> Option A
Quick Check:
Collection algorithms improve data handling = B [OK]
Hint: Remember: algorithms simplify data tasks fast [OK]
Common Mistakes:
Thinking algorithms slow down the app
Believing algorithms only work with numbers
Assuming algorithms make code complex
2. Which of the following is the correct way to use the filter algorithm on an array numbers to get only even numbers in Swift?
easy
A. let evens = numbers.filter { $0 / 2 == 0 }
B. let evens = numbers.filter { $0 % 2 == 0 }
C. let evens = numbers.filter { $0 % 2 = 0 }
D. let evens = numbers.filter { $0 == 2 }
Solution
Step 1: Understand the filter syntax in Swift
The filter method takes a closure that returns true for elements to keep. The condition for even numbers is number % 2 == 0.
Step 2: Check each option for correct syntax and logic
let evens = numbers.filter { $0 % 2 == 0 } uses the correct modulo operator and comparison. let evens = numbers.filter { $0 / 2 == 0 } uses division incorrectly. let evens = numbers.filter { $0 % 2 = 0 } uses assignment (=) instead of comparison (==). let evens = numbers.filter { $0 == 2 } filters only numbers equal to 2, not all evens.
Final Answer:
let evens = numbers.filter { $0 % 2 == 0 } -> Option B
Quick Check:
Correct filter syntax for evens = A [OK]
Hint: Use % 2 == 0 to find even numbers in filter [OK]
Common Mistakes:
Using / instead of % for even check
Using = instead of == in condition
Filtering only one number instead of all evens
3. What will be the output of this Swift code?
let names = ["Anna", "Bob", "Cathy", "David"]
let result = names.contains { $0.hasPrefix("C") }
print(result)
medium
A. nil
B. false
C. SyntaxError
D. true
Solution
Step 1: Understand the contains method with a closure
The contains method checks if any element satisfies the condition. Here, it checks if any name starts with "C".
Step 2: Check the array elements for the condition
"Cathy" starts with "C", so the condition is true, making result true.
Final Answer:
true -> Option D
Quick Check:
names contains prefix "C" = true [OK]
Hint: contains with closure returns true if any match found [OK]
Common Mistakes:
Thinking contains checks all elements and returns false if any fail
Confusing hasPrefix with contains
Expecting syntax error due to closure
4. Identify the error in this Swift code that tries to sort an array of integers:
let numbers = [3, 1, 4, 2]
let sorted = numbers.sorted(by: { a, b in a > b })
print(sorted)
medium
A. The closure should use '<' instead of '>' to sort ascending.
B. The sorted method cannot take a closure.
C. The array must be mutable to sort.
D. The closure parameters must be named 'x' and 'y'.
Solution
Step 1: Understand the sorted(by:) closure logic
The closure defines the sorting order. Using 'a > b' sorts descending, not ascending.
Step 2: Identify the intended sort order
Since the question implies sorting ascending, the closure should use 'a < b'. Other options are incorrect because sorted can take closures, arrays can be immutable for sorted, and parameter names are flexible.
Final Answer:
The closure should use '<' instead of '>' to sort ascending. -> Option A
Quick Check:
Use '<' for ascending sort closure [OK]
Hint: Use '<' in closure for ascending sort [OK]
Common Mistakes:
Thinking sorted needs mutable array
Believing closure parameter names are fixed
Assuming sorted can't take closures
5. You have a list of user scores: let scores = [10, 0, 5, 0, 8]. You want to create a dictionary where keys are the scores and values are the count of how many times each score appears, but you want to ignore zero scores. Which Swift code correctly uses collection algorithms to do this?
hard
A. let counts = scores.filter { $0 == 0 }.count
B. let counts = Dictionary(uniqueKeysWithValues: scores.map { ($0, 1) })
C. let counts = Dictionary(grouping: scores.filter { $0 != 0 }, by: { $0 }).mapValues { $0.count }
D. let counts = scores.reduce(into: [:]) { $0[$1] = 1 }
Solution
Step 1: Filter out zero scores
The code filters scores to exclude zeros using filter { $0 != 0 }.
Step 2: Group remaining scores and count occurrences
Using Dictionary(grouping:by:) groups scores by value, then mapValues { $0.count } counts how many times each score appears.
Final Answer:
let counts = Dictionary(grouping: scores.filter { $0 != 0 }, by: { $0 }).mapValues { $0.count } -> Option C
Quick Check:
Filter zeros, group by score, count occurrences = D [OK]
Hint: Filter zeros first, then group and count [OK]
Common Mistakes:
Using uniqueKeysWithValues which overwrites duplicates
Not filtering zeros before counting
Using reduce incorrectly without counting
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.