Protocol in Swift cannot be conformed to only by class type, but also by struct or enum. That means that we have to consider carefully if we should use mutating for some method or not. The keyword mutating is used to let variables be modified in struct and enum. If we forgot to add mutating in a protocol, the users of this protocol could never modify their own variables in the method. For example:

protocol Vehicle
    var numberOfWheels: Int {get}
    var color: UIColor {get set}

    mutating func changeColor()

struct MyCar: Vehicle {
    let numberOfWheels = 4
    var color = UIColor.blueColor()

    mutating func changeColor() {
        color = UIColor.redColor()

If we remove the mutating keyword in the definition of protocol, this snippet will not compile anymore. MyCar does not conform to protocol Vehicle since the method signatures are different between the mutating and immutating versions. Otherwise, if we omit the mutating before changeColor in MyCar struct, of course you know, we cannot assign to color in a struct method without mutating keyword.

You can add mutating keyword to the protocol if you own the source code. However, it would be a terrible thing if the protocol is defined in a framework. The only workaround would be changing MyCar to a class instead of a struct.

There is no need to add mutating before a method in class to conform to a protocol method with mutating keyword. A method in class can always change its variables. It means even if we are using mutating in a protocol, it is totally transparent to an implementation of class.