Where clauses help you add extra rules to your code, making it only work when certain conditions are true. This keeps your code safe and clear.
When you want a function to work only with certain types that meet specific rules.
When you want to filter items in a loop based on multiple conditions.
When you want to add extra checks to generic types in your code.
When you want to make your code easier to read by grouping conditions clearly.
Syntax
Swift
func functionName<T>(parameter: T) where T: Protocol, T: AnotherProtocol {
// code here
}
for item in collection where item.property == value {
// code here
}
The where keyword adds extra conditions to generics or loops.
You can combine multiple constraints separated by commas.
Examples
This function prints elements only if they can be described as text.
Swift
func printElements<T: Collection>(of collection: T) where T.Element: CustomStringConvertible {
for element in collection {
print(element.description)
}
}
This loop prints only even numbers from the list.
Swift
for number in numbers where number % 2 == 0 {
print(number)
}
This function compares two values only if they are the same type and can be compared.
Swift
func compare<T: Comparable, U: Comparable>(a: T, b: U) where T == U, T: Equatable {
print(a == b)
}
Sample Program
This program uses a where clause to make sure the function only accepts collections of Person that can be described as text. It then prints a birthday message for each person.
Swift
struct Person {
let name: Stringlet age: Int
}
func celebrateBirthday<T: Collection>(for people: T) where T.Element == Person, T.Element: CustomStringConvertible {
for person in people {
print("Happy Birthday, \(person.description)!")
}
}
extension Person: CustomStringConvertible {
var description: String {
"\(name), age \(age)"
}
}
let friends = [Person(name: "Anna", age: 30), Person(name: "Ben", age: 25)]
celebrateBirthday(for: friends)
OutputSuccess
Important Notes
Where clauses make your code safer by adding clear rules.
You can use where clauses in functions, loops, and extensions.
Using where clauses helps others understand your code better.
Summary
Where clauses add extra conditions to your code.
They work well with generics and loops.
They make your code safer and easier to read.
Practice
(1/5)
1. What is the main purpose of a where clause in Swift when used with generics?
easy
A. To define a function's return type
B. To declare a new generic type
C. To add extra conditions that generic types must satisfy
D. To create a loop over a collection
Solution
Step 1: Understand generics and constraints
Generics allow flexible types, but sometimes we want to restrict them to certain types or protocols.
Step 2: Role of where clause
The where clause adds extra conditions to generic parameters, ensuring they meet specific requirements.
Final Answer:
To add extra conditions that generic types must satisfy -> Option C
Quick Check:
Where clause = extra generic constraints [OK]
Hint: Where clauses add conditions to generics or loops [OK]
Common Mistakes:
Confusing where clause with function return type
Thinking where declares new types
Using where to create loops
2. Which of the following is the correct syntax for using a where clause in a generic function in Swift?
easy
A. func example<T>(value: T) where T: Equatable {}
B. func example(value: T) {}
C. func example<T>(value: T) if T: Equatable {}
D. func example<T>(value: T) where T == Equatable {}
Solution
Step 1: Recall correct where clause syntax
In Swift, the where clause comes after the generic parameter list and before the function body.
Step 2: Check each option
func example<T>(value: T) where T: Equatable {} uses correct syntax: func example<T>(value: T) where T: Equatable {}. Others misuse placement or keywords.
Final Answer:
func example<T>(value: T) where T: Equatable {} -> Option A
Quick Check:
Where clause after generics = correct syntax [OK]
Hint: Where clause always follows generic parameters () [OK]
Common Mistakes:
Placing where inside angle brackets
Using if instead of where
Using == instead of : for protocol conformance
3. What will be the output of the following Swift code?
func printIfEqual(_ a: T, _ b: U) where T == U, T: Equatable {
if a == b {
print("Equal")
} else {
print("Not Equal")
}
}
printIfEqual(5, 5)
printIfEqual("hi", "hello")
medium
A. Equal\nEqual
B. Compilation error
C. Not Equal\nNot Equal
D. Equal\nNot Equal
Solution
Step 1: Understand the where clause constraints
The function requires T and U to be the same type and conform to Equatable, so both arguments must be comparable and same type.
Step 2: Analyze the calls
First call: 5 and 5 are Ints, equal, so prints "Equal". Second call: "hi" and "hello" are Strings, same type, but not equal, so prints "Not Equal".
Final Answer:
Equal
Not Equal -> Option D
Quick Check:
Same type & Equatable check = output [OK]
Hint: Check type equality and Equatable conformance for output [OK]
Common Mistakes:
Assuming different types allowed
Expecting compilation error
Ignoring Equatable conformance
4. Identify the error in this Swift function using a where clause:
func compareValues(a: T, b: U) where T: Comparable, U: Comparable {
if a < b {
print("a is less")
} else {
print("b is less or equal")
}
}
medium
A. Missing return type in function signature
B. Cannot compare different generic types with < operator
C. where clause syntax is incorrect
D. Function parameters should be optional
Solution
Step 1: Understand the where clause constraints
The function requires T and U to be Comparable, but they can be different types.
Step 2: Check the comparison operation
Comparing a < b is invalid because Swift cannot compare two different types even if both are Comparable.
Final Answer:
Cannot compare different generic types with < operator -> Option B
Quick Check:
Different Comparable types can't be compared directly [OK]
Hint: Comparable types must be same to compare with < [OK]
Common Mistakes:
Assuming Comparable allows cross-type comparison
Ignoring type mismatch in operators
Thinking where clause syntax is wrong
5. Given a generic function that filters an array of elements only if they conform to both Comparable and Numeric, which where clause correctly expresses this constraint?
To require a type to conform to multiple protocols, use the & symbol between them.
Step 2: Analyze each option
T: Comparable & Numeric correctly uses T: Comparable & Numeric. T: Comparable, Numeric uses comma which is invalid syntax. T: Comparable where T: Numeric misuses where inside where clause. T: Numeric or Comparable uses 'or' which is not valid.
Final Answer:
T: Comparable & Numeric -> Option A
Quick Check:
Use & to combine protocols in where clause [OK]
Hint: Use & to combine multiple protocol constraints [OK]
Common Mistakes:
Using commas instead of &
Misplacing where keyword
Using 'or' instead of &
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.