Bird
Raised Fist0
Swiftprogramming~5 mins

Protocol composition in practice in Swift - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Protocol composition in practice
O(1)
Understanding Time Complexity

When using protocol composition in Swift, it is important to understand how the program's work grows as input changes.

We want to know how combining multiple protocols affects the time it takes to run code that uses them.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


protocol A {
    func doA()
}
protocol B {
    func doB()
}

func performAction(item: A & B) {
    item.doA()
    item.doB()
}

This code defines two protocols and a function that takes an item conforming to both. It calls methods from both protocols.

Identify Repeating Operations

Look for repeated work inside the function when called with different inputs.

  • Primary operation: Calling two methods on the item.
  • How many times: Each method is called once per function call.
How Execution Grows With Input

The function calls two methods regardless of input size. If the methods themselves do not loop, the work stays the same.

Input Size (n)Approx. Operations
102
1002
10002

Pattern observation: The total work stays constant regardless of input size.

Final Time Complexity

Time Complexity: O(1)

This means the time to run stays constant regardless of input size.

Common Mistake

[X] Wrong: "Using protocol composition makes the function slower because it combines protocols."

[OK] Correct: Protocol composition itself does not add extra loops or repeated work; it just requires the item to meet multiple requirements.

Interview Connect

Understanding how protocol composition affects performance helps you write clear and efficient Swift code, a useful skill in many coding situations.

Self-Check

"What if the methods doA() and doB() each contained loops over the input? How would that change the time complexity?"

Practice

(1/5)
1. What does protocol composition in Swift allow you to do?
easy
A. Combine multiple protocols into one requirement without creating a new protocol
B. Create a new class that inherits from multiple classes
C. Define a protocol with stored properties
D. Override methods in a protocol extension

Solution

  1. Step 1: Understand protocol composition concept

    Protocol composition uses the & operator to require multiple protocols at once without defining a new protocol.
  2. Step 2: Compare options with concept

    Only Combine multiple protocols into one requirement without creating a new protocol correctly describes combining multiple protocols without creating a new one. Other options describe unrelated or incorrect Swift features.
  3. Final Answer:

    Combine multiple protocols into one requirement without creating a new protocol -> Option A
  4. Quick Check:

    Protocol composition = Combine protocols [OK]
Hint: Remember & means combine protocols, not inherit classes [OK]
Common Mistakes:
  • Confusing protocol composition with class inheritance
  • Thinking protocols can have stored properties
  • Believing protocol extensions override methods
2. Which of the following is the correct syntax to declare a function parameter that requires both Codable and Equatable protocols using protocol composition?
easy
A. func save(item: Codable | Equatable) {}
B. func save(item: Codable & Equatable) {}
C. func save(item: Codable, Equatable) {}
D. func save(item: Codable && Equatable) {}

Solution

  1. Step 1: Recall protocol composition syntax

    Swift uses & to combine protocols in type requirements, like Codable & Equatable.
  2. Step 2: Evaluate each option

    func save(item: Codable & Equatable) {} uses correct & syntax. func save(item: Codable | Equatable) {} uses | which is invalid. func save(item: Codable, Equatable) {} uses comma which is invalid. func save(item: Codable && Equatable) {} uses && which is invalid.
  3. Final Answer:

    func save(item: Codable & Equatable) {} -> Option B
  4. Quick Check:

    Use & to combine protocols [OK]
Hint: Use & to combine protocols, not |, comma, or && [OK]
Common Mistakes:
  • Using | or && instead of & for protocol composition
  • Separating protocols with commas in parameter types
  • Confusing logical operators with protocol composition
3. What will be the output of the following Swift code?
protocol A { func foo() }
protocol B { func bar() }
struct MyStruct: A, B {
  func foo() { print("foo") }
  func bar() { print("bar") }
}
func callBoth(item: A & B) {
  item.foo()
  item.bar()
}
let obj = MyStruct()
callBoth(item: obj)
medium
A. foo\nbar
B. foo
C. bar
D. Compilation error

Solution

  1. Step 1: Understand protocol composition usage

    The function callBoth requires an argument conforming to both A and B. MyStruct conforms to both.
  2. Step 2: Trace function calls

    Inside callBoth, foo() prints "foo" and bar() prints "bar". Both are called in order.
  3. Final Answer:

    foo bar -> Option A
  4. Quick Check:

    Both protocol methods called = foo\nbar [OK]
Hint: Both protocols' methods run in order when composed [OK]
Common Mistakes:
  • Assuming only one protocol method runs
  • Expecting a compile error due to protocol composition
  • Confusing protocol conformance with inheritance
4. Identify the error in this Swift code using protocol composition:
protocol P1 { func p1Method() }
protocol P2 { func p2Method() }
func testFunc(param: P1 & P2) {
  param.p1Method()
  param.p2Method()
}
struct S: P1 {
  func p1Method() { print("P1") }
}
let s = S()
testFunc(param: s)
medium
A. Method p2Method is missing in testFunc
B. Function testFunc has wrong parameter syntax
C. Protocols P1 and P2 cannot be combined
D. Struct S does not conform to protocol P2

Solution

  1. Step 1: Check struct conformance

    Struct S conforms only to P1, missing P2 conformance.
  2. Step 2: Analyze function parameter requirement

    Function testFunc requires a parameter conforming to both P1 and P2. Passing s fails because s lacks P2.
  3. Final Answer:

    Struct S does not conform to protocol P2 -> Option D
  4. Quick Check:

    Missing protocol conformance causes error [OK]
Hint: Check all protocols are conformed before passing composed type [OK]
Common Mistakes:
  • Assuming partial protocol conformance is enough
  • Thinking function parameter syntax is incorrect
  • Believing protocols cannot be combined with &
5. Given these protocols and structs:
protocol Drawable { func draw() }
protocol Colorable { var color: String { get } }
struct Circle: Drawable, Colorable {
  var color: String
  func draw() { print("Drawing a circle") }
}
struct Square: Drawable {
  func draw() { print("Drawing a square") }
}

Which of the following function signatures correctly accepts only objects that are both Drawable and Colorable?
hard
A. func render(item: Drawable) { item.draw() }
B. func render(item: Drawable | Colorable) { item.draw() }
C. func render(item: Drawable & Colorable) { item.draw(); print(item.color) }
D. func render(item: Colorable) { print(item.color) }

Solution

  1. Step 1: Understand protocol composition for parameters

    To accept only objects conforming to both Drawable and Colorable, use Drawable & Colorable.
  2. Step 2: Check each function signature

    func render(item: Drawable & Colorable) { item.draw(); print(item.color) } uses correct composition and accesses both draw() and color. Options A, B, and D either use invalid syntax or accept only one protocol.
  3. Final Answer:

    func render(item: Drawable & Colorable) { item.draw(); print(item.color) } -> Option C
  4. Quick Check:

    Use & to require multiple protocols [OK]
Hint: Use & to require multiple protocols in parameters [OK]
Common Mistakes:
  • Using | instead of & for protocol composition
  • Accepting only one protocol when both are needed
  • Trying to access properties/methods not guaranteed by parameter type
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard