Swift的protocol不仅可以被class类型实现,也适用于struct和enum。因为这个原因,我们在写接口给别人用时需要多考虑是否使用mutating来修饰方法,比如定义为mutating func myMethod()。Swift的mutating关键字修饰方法是为了能在该方法中修改struct或enum的变量,所以如果你没在接口方法里写mutating,别人如果用struct或者enum来实现这个接口,就不能在方法里改变自己的变量了。比如下面的代码:
如果把protocol定义中的mutating去掉的话,MyCar就怎么都过不了编译了:保持现有代码不变的话,会报错说没有实现接口;如果去掉mutating的话,会报错说不能改变结构体成员。这个接口的使用者的忧伤的眼神,相信你能想象得出。
另外,在使用class来实现带有mutating的方法的接口时,具体实现的前面是不需要加mutating修饰的,因为class可以随意更改自己的成员变量。所以说在接口里用mutating修饰方法,对于class的实现是完全透明,可以当作不存在的。