Bird
Raised Fist0
Swiftprogramming~3 mins

Why Protocol composition in practice in Swift? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if you could mix and match abilities in your code as easily as picking toppings on a pizza?

The Scenario

Imagine you have several roles in a team, like a coder, a tester, and a designer. You want to assign tasks to people who can do multiple roles, but you write separate code for each role combination.

The Problem

This manual way means writing many repeated checks and classes for every possible role mix. It gets messy, slow to update, and easy to make mistakes when roles change.

The Solution

Protocol composition lets you combine multiple roles into one requirement easily. You write clean code that says, "I need someone who is both a coder and a tester," without making new classes for every mix.

Before vs After
✗ Before
protocol Coder { func code() }
protocol Tester { func test() }
class CoderTester: Coder, Tester {
  func code() {}
  func test() {}
}
✓ After
func assignTask(to person: Coder & Tester) {
  person.code()
  person.test()
}
What It Enables

It enables writing flexible, clear, and reusable code that works with any combination of capabilities without extra classes.

Real Life Example

In an app, you might want a function that accepts any object that can both draw and animate. Protocol composition lets you require both abilities simply and safely.

Key Takeaways

Manual role combinations cause repeated, hard-to-maintain code.

Protocol composition combines multiple protocols into one easy requirement.

This leads to cleaner, more flexible, and reusable code.

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