Protocol requirements (methods and properties) in Swift - Time & Space Complexity
When using protocols with required methods and properties, it's important to know how the time to run code changes as the program grows.
We want to see how the number of operations grows when calling these protocol requirements.
Analyze the time complexity of the following code snippet.
protocol Drawable {
func draw()
var color: String { get }
}
func renderAll(drawables: [Drawable]) {
for item in drawables {
item.draw()
print(item.color)
}
}
This code defines a protocol with a method and a property, then calls them on each item in a list.
Look for loops or repeated calls.
- Primary operation: Looping through the array and calling
draw()and accessingcoloron each item. - How many times: Once for each item in the
drawablesarray.
As the number of items grows, the number of calls grows the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 calls to draw() and 10 property accesses |
| 100 | About 100 calls to draw() and 100 property accesses |
| 1000 | About 1000 calls to draw() and 1000 property accesses |
Pattern observation: The work grows directly with the number of items.
Time Complexity: O(n)
This means the time to run grows in a straight line with the number of items.
[X] Wrong: "Calling protocol methods is slower and adds extra loops behind the scenes."
[OK] Correct: Calling a protocol method or property is just like calling any method once per item; it does not add hidden loops or extra repeated work.
Understanding how protocol requirements affect performance helps you explain your code choices clearly and confidently in real projects.
What if the draw() method itself contained a loop over another collection? How would that change the time complexity?
Practice
Solution
Step 1: Understand protocol purpose
Protocols define a set of methods and properties that a type must implement.Step 2: Check adoption requirements
Any type adopting a protocol must provide implementations for all its requirements.Final Answer:
To implement all the methods and properties declared in the protocol -> Option DQuick Check:
Protocol adoption = implement all requirements [OK]
- Thinking protocols require inheritance from a class
- Assuming methods can be skipped
- Confusing protocol adoption with subclassing
Solution
Step 1: Recall property syntax in protocols
Read-only properties use { get } to indicate they must be readable but not necessarily writable.Step 2: Analyze options
var name: String { get } uses { get } correctly; var name: String { get set } requires read-write; let name: String is invalid in protocols; func name() -> String is a method, not a property.Final Answer:
var name: String { get } -> Option AQuick Check:
Read-only property = { get } [OK]
- Using let instead of var in protocol
- Confusing methods with properties
- Using { get set } for read-only properties
protocol Vehicle {
var speed: Double { get set }
func description() -> String
}
struct Car: Vehicle {
var speed: Double
func description() -> String {
return "Car speed is \(speed) km/h"
}
}
let myCar = Car(speed: 80)
print(myCar.description())What is the output when this code runs?
Solution
Step 1: Check protocol conformance
Car struct implements the required property speed and method description(), fulfilling Vehicle protocol.Step 2: Analyze print output
The description() returns "Car speed is \(speed) km/h". Since speed is 80.0 (Double), string interpolation formats it as "80.0".Final Answer:
Car speed is 80.0 km/h -> Option BQuick Check:
Protocol methods implemented = correct output [OK]
- Expecting 80 instead of 80.0
- Thinking protocol conformance causes error
- Missing string interpolation syntax
protocol Shape {
var area: Double { get }
func perimeter() -> Double
}
struct Square: Shape {
var side: Double
var area: Double {
side * side
}
}What is the error in the code?
Solution
Step 1: Check protocol requirements
Shape protocol requires a read-only property area and a method perimeter().Step 2: Verify Square struct implementation
Square implements area as computed property but does not implement perimeter() method.Final Answer:
Missing implementation of perimeter() method -> Option CQuick Check:
All protocol methods must be implemented [OK]
- Assuming computed properties are not allowed
- Thinking get set is required for read-only
- Ignoring missing method implementations
Identifiable that requires a read-only id property of type String and a method identify() that prints the id. Which of the following is the correct protocol and extension to provide a default implementation of identify()?Solution
Step 1: Define protocol requirements
id must be read-only, so use { get } and identify() method with no return.Step 2: Provide default implementation in extension
Extension implements identify() printing "ID: \(id)" matching protocol signature.Final Answer:
protocol Identifiable { var id: String { get }; func identify() } extension Identifiable { func identify() { print("ID: \(id)") } } -> Option AQuick Check:
Read-only property + default method in extension [OK]
- Using let in protocol property
- Changing method signature in extension
- Making id writable when only read-only needed
Ready to prove it?
Pass the test and this pattern moves unknown
