In-out parameters for mutation in Swift - Time & Space Complexity
When using in-out parameters in Swift, we want to see how the time to run the code changes as the input size grows.
We ask: How does changing the input affect how long the function takes?
Analyze the time complexity of the following code snippet.
func doubleValues(_ numbers: inout [Int]) {
for i in 0 ..< numbers.count {
numbers[i] *= 2
}
}
var myNumbers = [1, 2, 3, 4, 5]
doubleValues(&myNumbers)
This function doubles each number in an array by changing the array directly using an in-out parameter.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: A for-loop that goes through each element in the array.
- How many times: Exactly once for each element in the array.
As the array gets bigger, the function does more work because it doubles each number one by one.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 times doubling |
| 100 | 100 times doubling |
| 1000 | 1000 times doubling |
Pattern observation: The work grows directly with the number of items. Double the items, double the work.
Time Complexity: O(n)
This means the time to run the function grows in a straight line with the size of the input array.
[X] Wrong: "Using in-out parameters makes the function run faster because it changes data directly."
[OK] Correct: The speed depends on how many items you process, not just on using in-out. The loop still runs once per item.
Understanding how in-out parameters affect time helps you explain how your code handles data changes efficiently in real projects.
"What if we changed the function to call itself recursively for each element? How would the time complexity change?"
Practice
What does the inout keyword do in Swift functions?
Solution
Step 1: Understand the role of
Theinoutinoutkeyword allows a function to receive a variable and modify it directly.Step 2: Effect on the original variable
Changes made inside the function affect the original variable outside the function.Final Answer:
Allows the function to modify the original variable passed in. -> Option AQuick Check:
inoutmeans modify original variable [OK]
inout means function can change your variable [OK]- Thinking
inoutcreates a copy instead of modifying original - Forgetting to use & when calling the function
- Assuming variables are constant inside the function
Which of the following is the correct way to declare a function with an inout parameter in Swift?
func updateValue(____ value: inout Int) { value += 10 }Solution
Step 1: Recall Swift syntax for
The correct syntax placesinoutparametersinoutbefore the type, after the parameter name:paramName: inout Type.Step 2: Match the options
func updateValue(value: inout Int) matches this syntax exactly:value: inout Int.Final Answer:
func updateValue(value: inout Int) -> Option BQuick Check:
Parameter syntax = name: inout Type [OK]
inout goes after parameter name, before type [OK]- Placing
inoutbefore parameter name - Swapping parameter name and type order
- Using invalid syntax like 'inout value in Int'
What will be the output of this Swift code?
func doubleValue(_ number: inout Int) {
number *= 2
}
var myNum = 5
doubleValue(&myNum)
print(myNum)Solution
Step 1: Understand the function behavior
The function doubles the value of the passed variable by multiplying it by 2.Step 2: Trace the code execution
VariablemyNumstarts at 5, is passed with&to allow mutation, so after the function call it becomes 10.Final Answer:
10 -> Option CQuick Check:
In-out parameter doubles 5 to 10 [OK]
- Forgetting & when calling function
- Expecting original value unchanged
- Confusing parameter passing with copy
Identify the error in this Swift code snippet:
func increment(_ value: inout Int) {
value += 1
}
let number = 10
increment(&number)Solution
Step 1: Check variable mutability
The variablenumberis declared withlet, making it a constant.Step 2: Understand inout parameter requirements
Inout parameters require a variable that can be modified, so constants cannot be passed.Final Answer:
Cannot pass a constant as an inout parameter. -> Option AQuick Check:
Inout needs variable, not constant [OK]
- Trying to pass constants as inout parameters
- Forgetting & when calling function
- Thinking function must return value when using inout
You want to write a function swapValues that swaps two integers using inout parameters. Which of the following implementations correctly swaps the values?
func swapValues(_ a: inout Int, _ b: inout Int) {
____
}Solution
Step 1: Understand swapping logic
To swap two values, you need a temporary variable to hold one value while assigning the other.Step 2: Check each option
var temp = a a = b b = temp correctly declares a temporary variable withvarand swaps values safely. let temp = a temp = b b = temp usesletwhich is immutable and causes error. a = b b = a overwritesabefore assigningb. a = b b = a - b a = a - b uses arithmetic swap but is more complex and not recommended here.Final Answer:
var temp = a a = b b = temp -> Option DQuick Check:
Use temp variable with var to swap values [OK]
- Using let for temporary variable causing immutability error
- Overwriting one variable before saving its value
- Trying to swap without a temporary variable incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
