Swift 100Tips_2 将Protocol 的方法声明为Mutating

Swift 的Procotol 不仅可以被Class 类实现,也适合于struct 和enum。 因为这个原因,我们在写接口给别人用时需要多考虑是否使用mutating关键字修饰方法,比如定义为mutating func myMethod()。Swift的mutating 关键字修饰方法是为了能在该方法中修改 Struct和Enum 的变量,所以如果你没在接口方法里写Mutating,别人如果用Struct 和Enum 来实现这个接口,就不能在方法里改变自己的变量了。比如下面的代码:

 protocol Vehicle{
        var  numberOfWheels:Int{get}
        var color :UIColor{get set}
         mutating func changeColor()
}
   struct MyCar:Vehicle{
   let numberOfWheels:Int=4
    var color=UIColor.blueColor()

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

}

如果把protocol定义中的mutating 去掉的话,MyCar 就怎么也过不了编译了:保持现有的代码不变的话,会报错说没有实现接口:如果去掉mutating 的话,会报错说不能改变结构体变量。
另外,在使用class 来实现带有mutating 的方法的接口时,具体实现的前面是不需要加mutating 修饰的,因为class 可以随意更改自己的成员变量。 所以说在接口中使用mutating 修饰方法,对于class 的实现是完全透明的,可以当做不存在。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容