Protocol Extension, Mutating Function Protocol Extension, Mutating Function ios ios

Protocol Extension, Mutating Function


If you intend to use the protocol only for classes then you can makeit a class protocol (and remove the mutating keyword):

protocol ColorImpressionableProtocol : class {    // ...    func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?)}

Then

init(impresion: ColorImpressionableProtocol?){    super.init(nibName: nil, bundle: nil)    adoptColorsFromImpresion(impresion)}

compiles without problems.


You are adopting this protocol in a class so the self (which is reference type) is immutable. The compiler expects self to be mutable because of the mutable method declared in protocol. That's the reason you are getting this error.

The possible solutions are :

1) Implement a non mutating version of the method where the protocol being adopted. ie: implement the method in adopting class instead as a protocol extension.

class MyClass : ColorImpressionableProtocol {   func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?){        lightAccentColor = impresion?.lightAccentColor        accentColor = impresion?.accentColor        darkAccentColor = impresion?.darkAccentColor        specialTextColor = impresion?.specialTextColor    }}

2) Make the protocol as class only protocol. This way we can remove the mutating keyword. It's the easiest solution but it can be only used in class.

To make protocol class only :

protocol MyProtocolName : AnyObject { }ORprotocol MyProtocolName : class { }

3) Make sure only value types adopt this protocol.This may not be useful in all scenarios.

Here is the detailed explanation and solution for this case.