简介Swift面向协议编程

来源:互联网 发布:网页游戏自动挂机软件 编辑:程序博客网 时间:2024/05/16 08:18
    协议定义了某一批所要遵循的规范,但不关心类的内部状态数据,也不关心类方法的实现细节。它只规定类中必须提供的方法。类、结构体、枚举通过提供协议所要求的方法,属性的具体实现来采用协议。
    任意能够满足协议要求的类型被称为协议的遵循者。
    这种让规范和实现分离的方式正是协议的好处,一种松耦合的设计。
swift中协议的作用,就相当于其他语言中的作用。
    协议可以要求遵循者体统特定的实例属性、实例方法、类方法、操作符或者下标等。

协议的定义方式:
(跟类、结构体、枚举的定义类似)
protocolSomeProtocol {
   
// 協議內容
}

结构体遵循协议
在类型后面加上冒号:再加上协议名称即可实现协议。实现多个协议是,各协议中间用逗号,隔开。
structSomeStructure: FirstProtocol, AnotherProtocol {
//结构体内容
}

类遵循协议
同结构体,但是如果一个类在含有父类的同时也采用了协议,应当把父类放在所有协议之前。
classSomeClass: SomeSuperClass,FirstProtocol,AnotherProtocol{
//类的内容
}

对属性的规定
    协议可以规定其遵循者提供特定名称与类型的实例属性类属性。无论其实存储还是计算型属性。此外还可以制定属性是只读还是可读写的。
如果协议要求属性可读写 -> 此属性不能是常量存储型或者只读计算型属性;
如果协议要求属性只读 -> 此属性是存储型或计算型都可以满足协议。

协议规定实例属性
protocolSomeProtocol {
    var musBeSettable :
Int { get set }/*var声明变量属性,含有实例要求的协议
                                        *
声明后的{ get set }表示可读写
                                        *{ get }
表示只读
                                        */

   
var doesNotNeedToBeSettable:Int{ get }
}


协议规定类属性
protocolAnotherProtocol {
   
class var someTypeProperty:Int{ get set }//class前缀代表该属性为类成员,在枚举和结构体中实现协议时,需要使用static关键字作为其前缀
}

对方法的规定:
    协议可以要求它的遵循者实现某些特定的实力方法或者类方法。这些方法作为协议的一部分,直接将方法放在协议的定义中,不需要大括号及其方法体。
    协议中类方法定义与类属性定义相似。
protocolSomeProtocol {
   
class func someTypeMethod()//在协议方法前置关键字class来表示,在枚举和结构体汇总实现方法时,需要使用static前缀来代替
}
 
协议中实例方法的定义
protocolRandomNumberGenerator {
   
func random() ->Double
}

//RandomNumberGenerator协议并不在意返回值是怎么产生的,它只强调了产生一个Double类型值



介绍完协议的方法、属性的定义规定之后,简要地提一下面向Swift协议编程的其他特性。


对突变方法的规定
如果有时候需要更改实例中的所属类型。在基于值类型(结构体、枚举)的实例方法中,将mutating关键字作为函数的前缀,写在func前面,表示可以在该方法中修改实例及其属性的所属类型。
如果实例中的实例方法打算改变其遵循者实例的类型,那么在实例定义时需要在方法前加mutating关键字,才能使结构体、枚举来采用并满足协议对方法的规定。


协议类型
尽管协议本身并不实现任何功能,但是协议可以被当做类型来使用。
三种使用场景:
  1. 协议类型作为函数、方法或者构造器中的参数类型或返回值类型。
  2. 协议类型作为常量、变量或属性的类型。
  3. 最为数组、字典或其他容器中的元素类型


委托(代理)模式
委托是一种允许类或者结构体将一些需要它们负责的功能委托其他类型的实例的设计模式。
委托模式的实现:定义协议来封装那些需要被委托的函数和方法,使其遵循者拥有这些被委托的方法。


在扩展中添加协议成员
    可以通过扩展来扩充已存在的类型(比如类、结构体、枚举等等)。扩展可以为已存在的类型添加属性、方法、下标、协议等成员。
    需要注意的是,通过扩展已存在的类型遵循协议时,该类型的所有实例随之添加协议中的属性、方法、下标、协议等成员。


通过扩展补充协议声明
当一个类型已经实现了协议中的所有要求,却没有声明时,可以通过扩展来补充协议声明。


集合中的协议类型
协议类型可以被集合使用,表示集合中的元素均为协议类型。


协议的继承
协议能够继承一到多个其他协议。语法与类的继承相似,多个协议间用逗号,分隔


协议的合成
一个协议可以由多个协议采用 protocol<SomeProtocol, AnotherProtocol>这样的格式进行组合,称为协议合成


检验协议的一致性
使用is和as操作符来检查协议的一致性或转化协议类型。


对可选协议的规定
可选协议中含有可选成员,其遵循者可以选择是否实现这些成员。在协议中使用@optional关键字作为前缀来定义可选成员。
你可以在可选方法名称后面,像someOptionalMethod?(someArgument)这样,来检查该方法时候被实现。可选方法和可选属性都会返回一个可选值,当其不可访问时,?之后的语句不会执行,并整体返回nil。 
0 0