Bird
Raised Fist0
Swiftprogramming~5 mins

Protocol composition in practice in Swift

Choose your learning style10 modes available
Introduction

Protocol composition lets you combine multiple protocols into one requirement. This helps you write flexible and clear code by saying "I need something that does all these things."

When a function needs an argument that meets several different behaviors at once.
When you want to group multiple protocol requirements without creating a new protocol.
When you want to write code that works with objects that share multiple capabilities.
When you want to keep your code simple and avoid deep inheritance chains.
Syntax
Swift
func exampleFunction(param: ProtocolA & ProtocolB) {
    // code using param
}

Use the ampersand (&) to combine protocols.

The parameter must conform to all listed protocols.

Examples
This function requires a vehicle that can both drive and refuel.
Swift
protocol Drivable {
    func drive()
}

protocol Refuelable {
    func refuel()
}

func operate(vehicle: Drivable & Refuelable) {
    vehicle.drive()
    vehicle.refuel()
}
This function works with any document that can be read and written.
Swift
protocol Readable {
    func read()
}

protocol Writable {
    func write()
}

func process(document: Readable & Writable) {
    document.read()
    document.write()
}
Sample Program

This program defines two protocols, Painter and Cleaner. The Robot struct conforms to both. The function startWork requires a worker that can paint and clean. We create a Robot and pass it to startWork, so it paints and cleans.

Swift
protocol Painter {
    func paint()
}

protocol Cleaner {
    func clean()
}

struct Robot: Painter, Cleaner {
    func paint() {
        print("Painting the wall")
    }
    func clean() {
        print("Cleaning the floor")
    }
}

func startWork(worker: Painter & Cleaner) {
    worker.paint()
    worker.clean()
}

let robot = Robot()
startWork(worker: robot)
OutputSuccess
Important Notes

Protocol composition is a way to require multiple behaviors without making a new protocol.

You can use protocol composition anywhere a type is expected, like function parameters or variables.

It helps keep your code flexible and easy to change later.

Summary

Protocol composition combines multiple protocols using &.

It lets you require multiple behaviors at once without new protocols.

Use it to write clear, 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