GeekBand.Swift-协议

2016/5/17  

协议,在很多语言中也叫作接口,常用于定义一套规范,使用者可以根据自己的不同需求,进行不同的实现。
协议:类型的约束合同,只描述外部的接口,不提供具体的实现

协议的成员

协议可以包含如下成员:属性、方法、初始化器、下标、操作符

协议的使用

一个类型可以实现多个协议。协议可以应用在结构枚举上。

protocol  Drawable{
    var description: String{
        get
    }
    func draw();
    init(); 
    subscript(index: Int) -> Int {
        get
    }
    func ==(leftValue: Self, rightValue: Self) -> Bool
}
class Image :Drawable{
    var description:String{
        get{
            return self.description;
        }
    }
    func draw(){
        print("draw");
    }
    ……
}

协议本质上是一种类型,可以最为声明类型,但是无法创建实例。
协议变量的内存模型遵从实际类型的内存模型:

  • 引用类型传参、拷贝采用传引用的方式
  • 值类型传参、拷贝采用值拷贝方式

检查协议类型实现

  • 使用is检查类型是否实现了协议
  • 使用as?和as!将类型转换为协议

协议中的属性

  1. 协议可以定义只读属性或读写属性
  2. 协议可以定义实例属性,也可以定义类型属性
  3. 协议只能定义变量属性,不能定义常量属性
  4. 实现属性时,可以实现为存储属性或计算属性

协议中的方法

  1. 协议可以定义实例方法,也可以定义类型方法
  2. 协议中的方法不能定义参数的默认值
  3. 针对值类型的mutaing协议方法:
    • 值类型实现的实例方法如果要修改实例本身,需要在协议方法的定义中标明mutaing关键字。同时在方法实现时也添加该关键字。
    • 添加了mutaing的协议方法,对类的实现方法无影响。

协议中的初始化器

  1. 协议可以定义初始化器,但不可以定义析构器
  2. 当class中实现协议定义的初始化器时,需要添加required关键字。
    • 标明子类也需要提供该初始化器
    • 如果定义为final类,则不需要添加required关键字
  3. 协议可以定义可失败的初始化器init?,具体实现时可以失败或成功。

更多协议形式

  • 协议继承
    • 一个协议可以继承一个或多个协议
    • 实现子协议的类型,也必须实现父协议
  • 协议组合
    • 可以使用protocol来组合多个协议
    • 实现组合协议的类型,必须实现组合中的每一个协议
    • 组合协议是一个临时类型
  • 可选协议
    • 协议的某些成员可以定义为optional,不必实现
    • 可选协议只能用于class
    • 可选协议必须标明@objc特性