一年一度的WWDC,对全球苹果开发者而言,仿佛久旱甘露——之前充满躁动,过程酣畅淋漓,过后满目清新。一个个让人眼前一亮的热点中,最不容易被开发者遗漏的,莫过于苹果公司不负众望,宣布Swift 2.0版发布,同时更是劲爆地宣布Swift开源,引起现场及遍布全球一个个屏幕后最响亮的欢呼和掌声。从发布会Keynote上可以大概寻觅到一些Swift 2.0的新增特性,包括泛型、更快的调试模式、更快的编译、错误处理机制、C函数指针API、注释里Markdown格式等。尽管WWDC如火如荼,相信苹果开发者之中仍有为数不少尚未开始接触Swift。时不我待,在2.0发布之前抓紧感受一些Swift的轻盈与灵动吧!
为此畅销书《Swifter : 100 个 Swift 开发必备 Tip》的作者喵神王巍给出的建议是,尽快开始动手实践开发一些 App。给自己定一个目标,比如花上几天时间或者一周的时间用 Swift 做一个能上架的简单的App 之类的。与简单地写个 Demo 相比,实际做一个真正的 app 对能力的提升是完全不同的,后者需要更多的全局考虑和综合能力。不少问题只有在实践中才会遇到,才会被解决,而对应的能力也才能被提升。
下面,我们就通过其中一个Tip的实例和代码,开始迈向Swift之旅……
将protocol 的方法声明为mutating
Swift的protocol不仅可以被class 类型实现,也适用于struct 和enum。因为这个原因,我们在写接口给别人用时需要多考虑是否使用mutating 来修饰方法,比如定义为mutating func myMethod()。Swift 的mutating 关键字修饰方法是为了能在该方法中修改struct 或enum 的变量,所以如果你没在接口方法里写mutating 的话,别人如果用struct 或者enum来实现这个接口的话,就不能在方法里改变自己的变量了。比如下面的代码:
代码语言:javascript复制protocolVehicle
{
var numberOfWheels: Int {get}
var color: UIColor {get set}
mutating func changeColor()
}
structMyCar: Vehicle {
let numberOfWheels = 4
var color =UIColor.blueColor()
mutating func changeColor(){
color = UIColor.redColor()
}
}
如果把protocol 定义中的mutating 去掉的话,MyCar 就怎么都过不了编译了:保持现有代码不变的话,会报错说没有实现接口;如果去掉mutating的话,会报错说不能改变结构体成员。这个接口的使用者的忧伤的眼神,相信你能想象得出。
另外,在使用class 来实现带有mutating 的方法的接口时,具体实现的前面是不需要加mutating 修饰的,因为class 可以随意更改自己的成员变量。所以说在接口里用mutating修饰方法,对于class 的实现是完全透明,可以当作不存在的。
本文摘自《Swifter : 100 个 Swift 开发必备 Tip》