Swiftorial Logo
Home
Swift Lessons
Tutorials
Learn More
Career
Resources
Defining Protocols in Swift

Defining Protocols in Swift

What is a Protocol?

In Swift, a protocol is a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. It defines a set of rules that a conforming type must implement. Protocols can be adopted by classes, structures, and enumerations, allowing for a flexible and reusable code structure.

Defining a Protocol

You define a protocol using the protocol keyword followed by the name of the protocol. You can specify properties and methods that must be implemented by any type that conforms to the protocol.

Here’s a basic example:

protocol Vehicle {

  var numberOfWheels: Int { get }

  func startEngine() -> String

}

This simple protocol defines a vehicle with a property for the number of wheels and a method to start the engine.

Conforming to a Protocol

To conform to a protocol, a type must implement all of the properties and methods defined by the protocol. Here’s how you can create a class that conforms to the Vehicle protocol:

class Car: Vehicle {

  var numberOfWheels: Int { return 4 }

  func startEngine() -> String {

    return "Engine started!"

  }

}

In this example, the Car class adopts the Vehicle protocol and provides implementations for the required properties and methods.

Protocol Properties and Methods

Protocols can define both instance and type properties, as well as methods. You can specify whether properties are gettable or settable. Here is an example that includes both an instance method and a type method:

protocol Appliance {

  var brand: String { get }

  func turnOn()

}

Any type conforming to the Appliance protocol would need to provide its own implementation of the turnOn() method and the brand property.

Protocol Inheritance

Protocols can inherit from other protocols, allowing for a more organized and hierarchical structure. When a protocol inherits from another, it gains all of the properties and methods of the parent protocol. Here’s an example:

protocol ElectricAppliance: Appliance {

  var power: Int { get }

}

In this case, ElectricAppliance inherits from Appliance and adds a new requirement for the power property.

Using Protocols with Extensions

Extensions in Swift allow you to add functionality to existing types, including protocols. You can extend a protocol to provide a default implementation of a method:

extension Vehicle {

  func description() -> String {

    return "This vehicle has \(numberOfWheels) wheels."

  }

}

Now, any type that conforms to the Vehicle protocol automatically gains the description() method.

Conclusion

Protocols in Swift are a powerful feature that promotes code reusability and flexibility. By defining protocols and ensuring that types conform to them, you can create a clear contract for functionality that can be implemented in a variety of ways. Whether you are working with classes, structs, or enums, protocols help maintain a clean and organized codebase.