📖 Scenario: Imagine you are building a simple app that manages different types of vehicles. You want all vehicles to be able to describe themselves with a short message.
🎯 Goal: You will create a protocol called VehicleDescription that requires a description method. Then, you will make a struct Car conform to this protocol using an extension. Finally, you will print the description of a Car instance.
📋 What You'll Learn
Create a protocol named VehicleDescription with a method func description() -> String
Create a struct named Car with a property model of type String
Use an extension to make Car conform to VehicleDescription
Implement the description() method inside the extension to return a string describing the car model
Create an instance of Car with model "Tesla Model S"
Print the result of calling description() on the Car instance
💡 Why This Matters
🌍 Real World
Protocols help define common behavior for different types in apps, making code easier to organize and extend.
💼 Career
Understanding protocol conformance via extensions is essential for writing clean, modular Swift code in iOS development.
Progress0 / 4 steps
1
Create the protocol and struct
Create a protocol called VehicleDescription with a method func description() -> String. Then create a struct called Car with a property model of type String.
Swift
Hint
Protocols define methods that types must implement. Structs hold data like the car model.
2
Add protocol conformance via extension
Use an extension to make Car conform to VehicleDescription. Implement the description() method inside the extension to return a string like "Car model: Tesla Model S" using the model property.
Swift
Hint
Extensions add protocol conformance outside the original struct. Use string interpolation to include the model.
3
Create a Car instance
Create a constant called myCar of type Car and set its model property to "Tesla Model S".
Swift
Hint
Use let to create a constant instance with the exact model string.
4
Print the car description
Write a print statement to display the result of calling description() on myCar.
Swift
Hint
Call description() on myCar inside print().
Practice
(1/5)
1. What is the main purpose of using an extension to conform a type to a protocol in Swift?
easy
A. To add protocol requirements to a type without modifying its original definition
B. To create a new subclass from an existing class
C. To override existing methods in a class
D. To declare a new protocol
Solution
Step 1: Understand protocol conformance
Protocols define a set of methods or properties a type must implement.
Step 2: Role of extensions
Extensions allow adding these implementations to a type without changing its original code.
Final Answer:
To add protocol requirements to a type without modifying its original definition -> Option A
Quick Check:
Extensions add protocol conformance without altering original type [OK]
Hint: Extensions add protocol methods without touching original code [OK]
Common Mistakes:
Thinking extensions create subclasses
Confusing extensions with method overriding
Believing extensions declare new protocols
2. Which of the following is the correct syntax to make a struct Car conform to protocol Drivable using an extension?
easy
A. protocol Drivable extension Car { func drive() { print("Driving") } }
4. The following code tries to make Rectangle conform to Shape via extension, but it causes a compile error. What is the error?
protocol Shape {
var area: Double { get }
}
struct Rectangle {
var width: Double
var height: Double
}
extension Rectangle: Shape {
func area() -> Double {
return width * height
}
}
medium
A. Method 'area()' should be a computed property, not a function
B. Cannot extend a struct to conform to a protocol
C. Missing initializer in Rectangle
D. Protocol Shape requires a method named 'area()', not a property
Solution
Step 1: Check protocol requirement
Shape requires a property area of type Double with a getter.
Step 2: Analyze extension implementation
The extension implements area() as a method, but protocol expects a computed property var area: Double { get }.
Final Answer:
Method 'area()' should be a computed property, not a function -> Option A
Quick Check:
Property requirement needs computed property, not method [OK]
Hint: Match protocol property with computed property, not method [OK]
Common Mistakes:
Implementing property as method
Thinking structs can't conform via extension
Ignoring protocol property vs method difference
5. You have a protocol Printable requiring a method printDetails(). You want to add this conformance to an existing class Book without changing its original code. Which approach correctly achieves this and allows printDetails() to print the book's title and author?
class Book {
let title: String
let author: String
init(title: String, author: String) {
self.title = title
self.author = author
}
}
hard
A. class Book: Printable {
func printDetails() {
print(title + author)
}
}
D. extension Printable: Book {
func printDetails() {
print(title + author)
}
}
Solution
Step 1: Understand requirement
We want to add Printable conformance to Book without changing Book's original code.
Step 2: Use extension to conform
extension Book: Printable {
func printDetails() {
print("Title: \(title), Author: \(author)")
}
} extends Book to conform to Printable and implements printDetails() accessing Book's properties.