# Swift Protocols

> Learn how protocols work in Swift to give different types a shared set of properties and methods, and how a struct or class adopts and conforms to them.

Author: Flavio Copes | Published: 2021-06-12 | Canonical: https://flaviocopes.com/swift-protocols/

> This tutorial belongs to the [Swift](https://flaviocopes.com/swift-introduction/) series

A protocol is a way to have different objects, of different types, have a common set of functionality.

A protocol is defined in this way:

```swift
protocol Mammal {

}
```

Structs and classes can **adopt a protocol** in this way:

```swift
struct Dog: Mammal {

}

class Cat: Mammal {

}
```

A protocol can define properties and methods, without providing values and implementations, and a struct/class must implement them:

```swift
protocol Mammal {
    var age: Int { get set }
    func walk()
}
```

The property can be defined as `get` or `get set`. If it's `get`, the property must be implemented as read only, with a getter.

Any type that adopts the protocol must **conform** to the protocol by implementing those methods or providing those properties:

```swift
struct Dog: Mammal {
    var age: Int = 0
    func walk() {
        print("The dog is walking")
    }
}

class Cat: Mammal {
    var age: Int = 0
    func walk() {
        print("The cat is walking")
    }
}
```

Structs and classes can adopt multiple protocols:

```swift
struct Dog: Mammal, Animal {

}

class Cat: Mammal, Animal {

}
```

Notice that for classes, this is the same syntax used to define a superclass. If there is a superclass, list it as the first item in the list, after the colon.
