Bird
Raised Fist0
Swiftprogramming~20 mins

Why protocol-oriented programming matters in Swift - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Protocol Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of protocol extension method call

What is the output of this Swift code using protocol extensions?

Swift
protocol Greetable {
    func greet() -> String
}

extension Greetable {
    func greet() -> String {
        return "Hello from protocol extension"
    }
}

struct Person: Greetable {
    func greet() -> String {
        return "Hello from Person"
    }
}

let p: Greetable = Person()
print(p.greet())
A"Hello from Person"
B"Hello from protocol extension"
CCompilation error: protocol method not implemented
DRuntime error: method not found
Attempts:
2 left
💡 Hint

Remember that when a concrete type implements a protocol method, that implementation is called instead of the protocol extension's default.

🧠 Conceptual
intermediate
1:30remaining
Why use protocols instead of base classes?

Which of the following is a key advantage of using protocols over base classes in Swift?

AProtocols allow multiple inheritance of behavior, while classes do not.
BProtocols can store properties with default values, classes cannot.
CProtocols automatically generate initializers for conforming types.
DProtocols enforce implementation of stored properties.
Attempts:
2 left
💡 Hint

Think about how Swift handles multiple inheritance and code reuse.

🔧 Debug
advanced
2:00remaining
Why does this protocol extension method not get called?

Given this code, why does the protocol extension method describe() not get called when using a concrete type?

Swift
protocol Describable {
    func describe() -> String
}

extension Describable {
    func describe() -> String {
        return "Default description"
    }
}

struct Item: Describable {
    // No describe() implementation here
}

let item = Item()
print(item.describe())
ARuntime error because <code>describe()</code> is not implemented in <code>Item</code>.
BCompilation error because <code>Item</code> does not implement <code>describe()</code>.
C"Default description" is printed because the extension provides a default implementation.
D"describe()" prints nothing because the method is empty.
Attempts:
2 left
💡 Hint

Protocol extensions can provide default implementations that conforming types inherit automatically.

📝 Syntax
advanced
2:00remaining
Identify the syntax error in protocol conformance

Which option contains a syntax error when trying to conform to a protocol with an associated type?

Swift
protocol Container {
    associatedtype Item
    func append(_ item: Item)
}

struct IntStack: Container {
    var items = [Int]()
    func append(_ item: Int) {
        items.append(item)
    }
}
A
struct IntStack: Container {
    var items = [Int]()
    mutating func append(_ item: Int) {
        items = items + [item]
    }
}
B
struct IntStack: Container {
    var items = [Int]()
    mutating func append(_ item: Int) {
        items.append(item)
    }
}
C
struct IntStack: Container {
    var items = [Int]()
    func append(item: Int) {
        items.append(item)
    }
}
D
struct IntStack: Container {
    var items = [Int]()
    func append(_ item: Int) {
        items.append(item)
    }
}
Attempts:
2 left
💡 Hint

Consider whether the method modifies the struct's properties and what keyword is needed.

🚀 Application
expert
2:30remaining
How does protocol-oriented programming improve code flexibility?

Which statement best explains how protocol-oriented programming improves flexibility in Swift code?

AIt forces all types to inherit from a common base class, simplifying type hierarchies.
BIt allows behavior to be shared through protocols and extensions without requiring inheritance, enabling composition.
CIt restricts types to implement only one protocol, reducing complexity.
DIt eliminates the need for generics by using protocols exclusively.
Attempts:
2 left
💡 Hint

Think about how protocols and extensions enable code reuse without inheritance.

Practice

(1/5)
1. What is the main purpose of protocols in Swift's protocol-oriented programming?
easy
A. To define a blueprint of methods and properties that a type must implement
B. To store data like variables and constants
C. To create user interfaces
D. To manage memory automatically

Solution

  1. Step 1: Understand what protocols represent

    Protocols specify a set of methods and properties that a type must have, acting as a blueprint.
  2. Step 2: Differentiate protocols from data storage

    Protocols do not store data themselves; they only define behavior and requirements.
  3. Final Answer:

    To define a blueprint of methods and properties that a type must implement -> Option A
  4. Quick Check:

    Protocols = Blueprint of behavior [OK]
Hint: Protocols define required behavior, not data storage [OK]
Common Mistakes:
  • Thinking protocols store data
  • Confusing protocols with classes or structs
  • Assuming protocols manage memory
2. Which of the following is the correct syntax to declare a protocol named Drivable in Swift?
easy
A. struct Drivable { func drive() }
B. class Drivable { func drive() }
C. func protocol Drivable() { drive() }
D. protocol Drivable { func drive() }

Solution

  1. Step 1: Recall protocol declaration syntax

    Protocols are declared using the keyword protocol followed by the name and curly braces.
  2. Step 2: Identify correct method declaration inside protocol

    Inside protocols, methods are declared without implementation, just the signature.
  3. Final Answer:

    protocol Drivable { func drive() } -> Option D
  4. Quick Check:

    Use 'protocol' keyword and method signature [OK]
Hint: Protocols start with 'protocol' keyword, not class or struct [OK]
Common Mistakes:
  • Using class or struct instead of protocol
  • Trying to implement method inside protocol
  • Incorrect keyword order
3. What will be the output of the following Swift code?
protocol Greetable {
    func greet() -> String
}

struct Person: Greetable {
    func greet() -> String {
        "Hello!"
    }
}

let p = Person()
print(p.greet())
medium
A. Error: Missing method implementation
B. greet()
C. Hello!
D. nil

Solution

  1. Step 1: Check protocol and struct conformance

    The struct Person conforms to Greetable and implements greet() returning "Hello!".
  2. Step 2: Understand the print statement output

    Calling p.greet() returns "Hello!", which is printed.
  3. Final Answer:

    Hello! -> Option C
  4. Quick Check:

    Protocol method implemented returns "Hello!" [OK]
Hint: Check if method returns a string and is called correctly [OK]
Common Mistakes:
  • Assuming protocol methods print automatically
  • Thinking missing implementation error occurs
  • Confusing method name with output
4. Identify the error in this Swift code using protocol-oriented programming:
protocol Runnable {
    func run()
}

struct Athlete: Runnable {
    // Missing run() implementation
}

let athlete = Athlete()
athlete.run()
medium
A. Athlete struct must implement run() method
B. Protocol Runnable cannot be used with structs
C. run() method should return a value
D. Cannot create instance of Athlete

Solution

  1. Step 1: Check protocol requirements

    The protocol Runnable requires a run() method to be implemented.
  2. Step 2: Verify struct conformance

    The struct Athlete does not implement run(), so it does not conform properly.
  3. Final Answer:

    Athlete struct must implement run() method -> Option A
  4. Quick Check:

    Protocol methods must be implemented in conforming types [OK]
Hint: Check if all protocol methods are implemented in struct/class [OK]
Common Mistakes:
  • Assuming protocols can't be used with structs
  • Thinking run() must return a value
  • Believing instance creation is the error
5. You want to create a reusable logging system in Swift using protocol-oriented programming. Which approach best supports easy reuse and maintenance?
hard
A. Use global variables to store logs
B. Define a protocol Loggable with a log() method, then extend it with default implementation
C. Write separate logging functions in each class without protocols
D. Create a base class Logger and inherit from it everywhere

Solution

  1. Step 1: Understand protocol-oriented programming benefits

    Protocols with default implementations allow behavior sharing without inheritance.
  2. Step 2: Evaluate options for reuse and maintenance

    Extending a protocol with default log() method lets many types reuse logging easily and maintain code in one place.
  3. Final Answer:

    Define a protocol Loggable with a log() method, then extend it with default implementation -> Option B
  4. Quick Check:

    Protocols + extensions = reusable, maintainable code [OK]
Hint: Use protocol with default methods for reusable behavior [OK]
Common Mistakes:
  • Relying on inheritance instead of protocols
  • Duplicating code in each class
  • Using global variables for behavior
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