Bird
Raised Fist0
Swiftprogramming~10 mins

Protocol extensions for shared behavior in Swift - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to declare a protocol named 'Greetable'.

Swift
protocol [1] {
    func greet() -> String
}
Drag options to blanks, or click blank then click option'
AGreet
BGreeter
CGreeting
DGreetable
Attempts:
3 left
💡 Hint
Common Mistakes
Using a class or struct name instead of a protocol name.
2fill in blank
medium

Complete the protocol extension to provide a default implementation for 'greet()'.

Swift
extension Greetable {
    func greet() -> String {
        return [1]
    }
}
Drag options to blanks, or click blank then click option'
A"Hello!"
BHello
Cgreet()
Dprint("Hello!")
Attempts:
3 left
💡 Hint
Common Mistakes
Returning a function call or printing instead of returning a string.
3fill in blank
hard

Fix the error by completing the struct declaration that conforms to 'Greetable'.

Swift
struct Person: [1] {
    var name: String
}
Drag options to blanks, or click blank then click option'
AGreeting
BGreeter
CGreetable
DGreet
Attempts:
3 left
💡 Hint
Common Mistakes
Using incorrect protocol names or forgetting conformance syntax.
4fill in blank
hard

Fill both blanks to override the default 'greet()' method in the struct.

Swift
extension Person {
    func greet() -> String {
        return [1] + ", " + [2]
    }
}
Drag options to blanks, or click blank then click option'
A"Hi"
Bname
C"Hello"
Dgreet()
Attempts:
3 left
💡 Hint
Common Mistakes
Using method calls instead of string or property names.
5fill in blank
hard

Fill all three blanks to create a dictionary that maps names to greetings for a list of people.

Swift
let greetings = Dictionary(uniqueKeysWithValues: people.filter({ person in person.name.count [2] 3 && person.greet() [3] "Hello!" }).map({ person in (person.name, person.[1]()) }))
Drag options to blanks, or click blank then click option'
Agreet
B>
C!=
Dname
Attempts:
3 left
💡 Hint
Common Mistakes
Using property 'name' instead of method 'greet' for greetings.
Using wrong comparison operators.

Practice

(1/5)
1. What is the main purpose of using protocol extensions in Swift?
easy
A. To store data inside protocols
B. To add shared behavior to multiple types without repeating code
C. To create new classes that inherit from protocols
D. To prevent types from conforming to protocols

Solution

  1. Step 1: Understand protocol extensions

    Protocol extensions allow adding default method or property implementations to protocols.
  2. Step 2: Identify the benefit

    This lets many types share behavior without rewriting the same code.
  3. Final Answer:

    To add shared behavior to multiple types without repeating code -> Option B
  4. Quick Check:

    Protocol extensions = shared behavior [OK]
Hint: Protocol extensions add default behavior to many types [OK]
Common Mistakes:
  • Thinking protocols can store data
  • Confusing protocol extensions with inheritance
  • Believing protocol extensions prevent conformance
2. Which of the following is the correct syntax to add a default method greet() to a protocol Greeter using an extension?
easy
A. extension Greeter: greet() { print("Hello") }
B. protocol Greeter { extension func greet() { print("Hello") } }
C. extension Greeter { func greet() { print("Hello") } }
D. protocol Greeter { func greet() { print("Hello") } }

Solution

  1. Step 1: Recall protocol extension syntax

    To add default behavior, use extension ProtocolName { func method() { ... } }.
  2. Step 2: Check each option

    extension Greeter { func greet() { print("Hello") } } correctly uses extension Greeter { func greet() { ... } }. Others misuse protocol or extension syntax.
  3. Final Answer:

    extension Greeter { func greet() { print("Hello") } } -> Option C
  4. Quick Check:

    Extension syntax = extension ProtocolName { func ... } [OK]
Hint: Use 'extension ProtocolName { func ... }' for default methods [OK]
Common Mistakes:
  • Putting method inside protocol body with implementation
  • Using 'extension' keyword inside protocol declaration
  • Trying to add method with colon syntax
3. Consider this Swift code:
protocol Vehicle {
    func start()
}

extension Vehicle {
    func start() {
        print("Starting vehicle")
    }
}

struct Car: Vehicle {}

let myCar = Car()
myCar.start()

What will be printed when this code runs?
medium
A. Starting vehicle
B. No output
C. Compile error: missing start() implementation
D. Runtime error

Solution

  1. Step 1: Understand protocol and extension

    The protocol Vehicle requires a start() method. The extension provides a default implementation.
  2. Step 2: Check struct Car conformance

    Car conforms to Vehicle but does not implement start(), so it uses the default from the extension.
  3. Final Answer:

    Starting vehicle -> Option A
  4. Quick Check:

    Default method runs if not overridden [OK]
Hint: Default extension methods run if type doesn't override [OK]
Common Mistakes:
  • Expecting compile error for missing method
  • Thinking no output will print
  • Confusing runtime error with missing implementation
4. This code tries to add a default method to a protocol but causes an error:
protocol Speaker {
    func speak()
}

extension Speaker {
    func speak() {
        print("Speaking")
    }
}

struct Person: Speaker {
    func speak() {
        print("Hello")
    }
}

let p = Person()
p.speak()

What is the error and how to fix it?
medium
A. No error; output is 'Hello'
B. Error: protocol method cannot have default implementation; remove extension
C. Error: struct must mark speak() as 'override'; add 'override' keyword
D. Error: protocol must declare speak() as optional

Solution

  1. Step 1: Analyze protocol and extension

    Protocol Speaker requires speak(). Extension provides default implementation.
  2. Step 2: Check struct Person implementation

    Person implements speak(), overriding the default. This is allowed and correct.
  3. Final Answer:

    No error; output is 'Hello' -> Option A
  4. Quick Check:

    Override default method by implementing in type [OK]
Hint: Implementing method in type overrides default extension [OK]
Common Mistakes:
  • Thinking default methods cause errors
  • Trying to use 'override' keyword in struct
  • Believing protocol methods must be optional
5. You want to add a shared method describe() to multiple unrelated types Cat and Dog without repeating code. Which approach using protocol extensions is best?
hard
A. Add a global function describe() that takes Any type
B. Add describe() method separately in Cat and Dog structs
C. Use class inheritance from a base class with describe() method
D. Create a protocol Animal with describe() and add default implementation in extension; make Cat and Dog conform

Solution

  1. Step 1: Identify shared behavior need

    Both Cat and Dog need the same describe() method without repeating code.
  2. Step 2: Use protocol with extension

    Define protocol Animal with describe(), then provide default describe() in protocol extension. Make Cat and Dog conform to Animal.
  3. Final Answer:

    Create a protocol Animal with describe() and add default implementation in extension; make Cat and Dog conform -> Option D
  4. Quick Check:

    Protocol extension = shared behavior for unrelated types [OK]
Hint: Use protocol + extension for shared methods across types [OK]
Common Mistakes:
  • Repeating code in each type
  • Using class inheritance when types are unrelated
  • Using global functions losing type safety
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