Bird
Raised Fist0
Swiftprogramming~10 mins

Protocol composition in Swift - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Protocol composition
Define Protocol A
↓
Define Protocol B
↓
Create variable with Protocol A & B
↓
Assign instance conforming to both
↓
Use combined protocol methods/properties
Protocol composition lets you combine multiple protocols into one type requirement, so a variable must conform to all listed protocols.
Execution Sample
Swift
protocol A {
    func foo()
}
protocol B {
    func bar()
}
struct S: A, B {
    func foo() { print("foo") }
    func bar() { print("bar") }
}
let x: A & B = S()
x.foo()
x.bar()
This code defines two protocols A and B, a struct S that conforms to both, then uses a variable x typed as A & B to call both methods.
Execution Table
StepActionEvaluationResult
1Define protocol A with method foo()protocol A createdA protocol exists
2Define protocol B with method bar()protocol B createdB protocol exists
3Define struct S conforming to A and BS has foo() and bar()S type ready
4Create variable x of type A & Bx can hold any instance conforming to bothx declared
5Assign S() instance to xS conforms to A and Bx = S()
6Call x.foo()Calls foo() from SOutput: foo
7Call x.bar()Calls bar() from SOutput: bar
8End of executionNo more codeProgram ends
💡 All steps executed; program ends after calling both methods on x
Variable Tracker
VariableStartAfter Step 5After Step 6After Step 7Final
xundefinedS instance assignedS instance (foo called)S instance (bar called)S instance
Key Moments - 3 Insights
Why can variable x call both foo() and bar() methods?
Because x is declared as type A & B, it must conform to both protocols, so it can call methods from both. See execution_table steps 4-7.
Can x hold an instance that conforms to only one protocol?
No, x requires an instance conforming to both A and B protocols. Step 5 shows assignment of S which conforms to both.
What happens if struct S only conforms to one protocol?
Assignment to x would fail because x expects both protocols. This is why S must conform to both, as in step 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of variable x after step 5?
AAn instance conforming only to protocol A
BUndefined
CAn instance of struct S
DAn instance conforming only to protocol B
💡 Hint
Check variable_tracker column 'After Step 5' and execution_table step 5
At which step does the program call the bar() method?
AStep 7
BStep 6
CStep 4
DStep 3
💡 Hint
Look at execution_table rows describing method calls
If struct S did not conform to protocol B, what would happen at step 5?
AAssignment would succeed
BAssignment to x would fail
Cx could call bar() method
DProgram would print 'bar'
💡 Hint
Refer to key_moments about protocol conformance and execution_table step 5
Concept Snapshot
Protocol composition syntax: let x: ProtocolA & ProtocolB
- Variable x must conform to all protocols combined
- Allows calling methods/properties from all protocols
- Useful to require multiple behaviors in one variable
Full Transcript
This example shows how to combine two protocols A and B using protocol composition in Swift. We define protocols A and B, each with one method. Then we create a struct S that conforms to both protocols by implementing both methods. We declare a variable x with type A & B, meaning it must conform to both protocols. We assign an instance of S to x. Then we call both methods foo() and bar() on x, which works because S implements both. The execution table traces each step from defining protocols, creating struct, declaring variable, assigning instance, and calling methods. The variable tracker shows how x changes from undefined to holding an instance of S. Key moments clarify why x can call both methods and why S must conform to both protocols. The quiz tests understanding of variable state and method calls during execution. The snapshot summarizes protocol composition usage in Swift.

Practice

(1/5)
1. What does protocol composition in Swift allow you to do?
easy
A. Override methods from multiple protocols automatically
B. Create a new class that inherits from multiple classes
C. Define a protocol that inherits from a single class
D. Combine multiple protocols into one requirement using &

Solution

  1. Step 1: Understand protocol composition concept

    Protocol composition uses the & symbol to combine multiple protocols into one requirement.
  2. Step 2: Differentiate from class inheritance

    Swift does not support multiple class inheritance, but protocol composition allows combining multiple protocols.
  3. Final Answer:

    Combine multiple protocols into one requirement using & -> Option D
  4. Quick Check:

    Protocol composition = Combine protocols with & [OK]
Hint: Remember & joins protocols to require multiple behaviors [OK]
Common Mistakes:
  • Confusing protocol composition with class inheritance
  • Thinking protocols can inherit from classes
  • Assuming protocol composition overrides methods
2. Which of the following is the correct syntax for protocol composition in Swift?
easy
A. protocol Combined = ProtocolA & ProtocolB
B. let combined: ProtocolA & ProtocolB
C. protocol Combined: ProtocolA & ProtocolB {}
D. class Combined: ProtocolA & ProtocolB {}

Solution

  1. Step 1: Identify correct usage of protocol composition

    Protocol composition is used in type annotations like let variable: ProtocolA & ProtocolB.
  2. Step 2: Check other options for syntax errors

    Options B and C misuse protocol inheritance or assignment syntax; D tries class inheritance from protocols incorrectly.
  3. Final Answer:

    let combined: ProtocolA & ProtocolB -> Option B
  4. Quick Check:

    Protocol composition syntax = type annotation with & [OK]
Hint: Use & in type declarations, not in protocol inheritance [OK]
Common Mistakes:
  • Trying to inherit protocols with & in protocol declaration
  • Using = instead of : or &
  • Using class inheritance syntax with protocols
3. What will be the output of this Swift code?
protocol A { func foo() }
protocol B { func bar() }
struct S: A, B {
  func foo() { print("foo") }
  func bar() { print("bar") }
}
func test(x: A & B) {
  x.foo()
  x.bar()
}
let s = S()
test(x: s)
medium
A. bar
B. foo
C. foo bar
D. Compilation error

Solution

  1. Step 1: Understand protocol composition parameter

    The function test requires an argument conforming to both protocols A and B.
  2. Step 2: Check struct S conformance and method calls

    S conforms to both A and B, so calling foo() and bar() prints "foo" and "bar" respectively.
  3. Final Answer:

    foo bar -> Option C
  4. Quick Check:

    Both protocol methods called = foo and bar printed [OK]
Hint: Both protocols' methods run when composed type passed [OK]
Common Mistakes:
  • Assuming only one protocol's method runs
  • Thinking protocol composition causes errors
  • Confusing struct conformance with protocol composition
4. Identify the error in this Swift code using protocol composition:
protocol P1 { func p1() }
protocol P2 { func p2() }
func doSomething(x: P1 & P2) {
  x.p1()
  x.p2()
}
struct MyStruct: P1 {
  func p1() { print("p1") }
}
doSomething(x: MyStruct())
medium
A. MyStruct does not conform to P2, so cannot be passed to doSomething
B. Syntax error in protocol composition declaration
C. Missing implementation of p2() in doSomething function
D. doSomething should accept only one protocol, not composition

Solution

  1. Step 1: Check struct conformance to protocols

    MyStruct conforms only to P1, missing P2 conformance.
  2. Step 2: Understand function parameter requirement

    doSomething requires an argument conforming to both P1 and P2, so MyStruct instance is invalid.
  3. Final Answer:

    MyStruct does not conform to P2, so cannot be passed to doSomething -> Option A
  4. Quick Check:

    Protocol composition requires all protocols conformed [OK]
Hint: Check all protocols are conformed before passing composed type [OK]
Common Mistakes:
  • Passing instance conforming to only one protocol
  • Thinking protocol composition allows partial conformance
  • Ignoring compiler errors about missing protocol methods
5. Given these protocols and structs:
protocol Drawable { func draw() }
protocol Colorful { var color: String { get } }
struct Circle: Drawable, Colorful {
  var color: String
  func draw() { print("Drawing a \(color) circle") }
}
struct Square: Drawable {
  func draw() { print("Drawing a square") }
}

Which code snippet correctly uses protocol composition to accept only Drawable and Colorful types?
hard
A. func render(item: Drawable & Colorful) { item.draw() }
B. func render(item: Drawable | Colorful) { item.draw() }
C. func render(item: Drawable) where item: Colorful { item.draw() }
D. func render(item: Drawable & Colorful) where item.color != "" { item.draw() }

Solution

  1. Step 1: Identify correct protocol composition syntax

    func render(item: Drawable & Colorful) { item.draw() } uses Drawable & Colorful correctly in parameter type.
  2. Step 2: Check other options for syntax or logic errors

    func render(item: Drawable | Colorful) { item.draw() } uses | which is invalid; C misuses where clause syntax; D uses where clause incorrectly on parameter.
  3. Final Answer:

    func render(item: Drawable & Colorful) { item.draw() } -> Option A
  4. Quick Check:

    Use & to combine protocols in function parameters [OK]
Hint: Use & to combine protocols in parameter types, not | or where [OK]
Common Mistakes:
  • Using | instead of & for protocol composition
  • Misusing where clauses in parameter declarations
  • Trying to filter protocol properties in parameter signature
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