swift中的协议

来源:互联网 发布:淘宝设计价格表 编辑:程序博客网 时间:2024/05/16 12:21

转自:http://blog.csdn.net/xn4545945/article/details/39800061

Swift中的协议能被类枚举,结构体实现.

[java] view plaincopy
  1. protocol SomeProtocol{  
  2.     //协议内容  
  3. }  
  4.   
  5. class SomeClass : SomeProtocol{ //实现协议, 可实现多个协议  
  6.       
  7. }  

2.1 协议中属性/方法/突变方法的要求

2.1.1 属性的要求

[java] view plaincopy
  1. protocol AnotherProtocol1{  
  2.     //class表示类成员(结构体/枚举中用static)  
  3.     class var property : Int { get set} //get, set 表示可读可写  
  4. }  
  5.   
  6. class AnotherClass1 : AnotherProtocol1{  
  7.     class var property : Int {  //实现协议中的属性  
  8.         get{  
  9.             return 10  
  10.         }  
  11.         set{  
  12.               
  13.         }  
  14.     }  
  15. }  

2.1.2 方法要求

[java] view plaincopy
  1. //不支持默认参数. 写法上只是没有方法的实现.  
  2. protocol AnotherProtocol2{  
  3.     func myFunc() -> Int   //只声明不实现  
  4. }  
  5.   
  6. class AnotherClass2 : AnotherProtocol2{  
  7.     func myFunc() -> Int {  //实现方法  
  8.         return 10  
  9.     }  
  10. }  

2.1.3 突变方法要求

能在方法或函数内部改变实例类型的方法称为突变方法. (mutating关键字)

在类中,可以不写mutating, 但在结构体与枚举中国必须写

[java] view plaincopy
  1. protocol Togg{  
  2.     mutating func togg()  
  3. }  
  4.   
  5. enum OnOffSwitch : Togg{  
  6.     case Off , On  
  7.       
  8.     mutating func togg() { //改变实例的值  
  9.         switch self{  
  10.         case .Off:  
  11.             self = On  
  12.         case .On:  
  13.             self = Off  
  14.         }  
  15.     }  
  16. }  
  17.   
  18. var lightSwitch = OnOffSwitch.Off  
  19. lightSwitch.togg()   //值变为On  

2.2 协议类型.

协议也可以当做类型来使用这点和函数一样.

1.可作为参数/返回值类型

2.可作为常量/变量/属性的类型

3.可作为数组/字典和其他元素类型

[java] view plaincopy
  1. protocol MyRect{  
  2.     func myLuckNumber() -> Int  
  3. }  
  4.   
  5. class MyRectImp : MyRect{  
  6.     func myLuckNumber() -> Int {  
  7.         return 10  
  8.     }  
  9. }  
  10.   
  11. class Dice {  
  12.     let sides :Int  
  13.     var gener : MyRect    //作为类型  
  14.     init(sides:Int, gener:MyRect){  //作为参数  
  15.         self.sides = sides  
  16.         self.gener = gener  
  17.     }  
  18. }  
  19.   
  20. var dice = Dice(sides: 6, gener: MyRectImp())  
  21. dice.gener.myLuckNumber()   //返回10 
0 0