用 "protocol" 关键字来声明一个协议。例:
注:对于类如果方法中要修改 self;对于结构体,枚举,如果方法中要修改 self 或者是 self的成员变量,在这种情况下,要使用"mutating" 关键字,来标明这个方法对 self 做了修改。(由于类是引用类型,而结构体和枚举是数值类型。所以,枚举和结构体的方法,即便是要修改self的成员变量,也要使用 mutating)
类,枚举,结构体都可以实现协议。例:
注意,在 SimpleStructure 声明时,使用了 "mutating" 关键字,来标明对结构体的修改。而在 SimpleClass 的声明中,不需要在方法前使用 "mutating"关键字来标记。因为,类的方法总是能对类进行修改。(实例方法如果要修改self的话,也要使用 "mutating")
使用 "extension" 关键字来为一个存在的类型(type,之所以这里用“类型”一词,是因为swift中,不单单是类可以有 extension,而且结构体,枚举,甚至是Float,Int这种数据类型,都能有extension。注意是Float,Int而不是float,int。前者是结构体化了的float,int)添加功能,例如一些新的方法和计算属性。你可以使用扩展来为声明在他处的类型,添加代理实现,或者甚至是为你从库或者框架中导入的类型(添加功能)。例:
扩展实际上对于项目架构有诸多好处,灵活运用组合的方式来编程,比使用继承的方式好的多得多。同时,使用过pods或者是使用过第三方库的开发者都知道,如果要对第三方库做修改,那么最好的办法就是为第三方库中对应的类添加扩展,而不是直接在第三方库中做修改。凡此种种,在项目中慢慢体会,必然会对扩展爱不释手。
你可以将一个协议像命名类型一样使用——比如,创建一个对象集合,集合中的对象有着不同的类型,但是都遵循同一个协议。当你在操作一个类型为协议类型的值时,协议定义之外方法是不可用的。(显而易见)例:
即使变量 protocolValue 有一个运行时类型 —— SimpleClass,编译器仍旧使用ExampleProtocol类型来处理它。这就意味着,你不能使用协议实现之外的,类中实现的方法或者属性。(简而言之,运行时protocolValue的类型是SimpleClass,但是protocolValue不能使用SimpleClass中,除开ExampleProtocol协议之外的方法和属性。因为,编译器始终认为protocolValue的类型是ExampleProtocol而不是SimpleClass)