swift文档笔记(十七) -- 协议

协议就是协议里的属性方法,在遵循协议的类·结构体·枚举中,必须要有实现。


1.协议语法 

protocol SomeProtocol {
// 这里是协议的定义部分 

var mustBeSettable: Int { get set } //读写

  var doesNotNeedToBeSettable: Int { get } //只读,但实际实现中可以是读写



2.构造器要求 

你可以在遵循协议的类中实现构造器,无论是作为指定构造器,还是作为便利构造器,你都必须为构造器实现标上 required 修饰符



3.扩展和协议

通过扩展添加协议一致性 (扩展类型,不用强制在原类型中,加入方法)

extension Dice: TextRepresentable {

     var textualDescription: String {

         return "A \(sides)-sided dice"

     }

通过扩展遵循协议 (本来不遵循协议的,变成遵循协议)

 
      

extension Dice: TextRepresentable {

协议可以通过扩展来为遵循协议的类型提供属性、方法以及下标的实现。(扩展协议)

 
      

//基于协议本身来实现这些功能,而无需在每个遵循协议的类型中都重复同样的实现,也无需使用全局函数。

//为协议扩展添加限制条件, where 子句来描述,只适用于集合中的元素遵循了TextRepresentable协议的情况。

extension RandomNumberGenerator where Generator.Element: TextRepresentable  {

    func randomBool() -> Bool {

        return random() > 0.5

    }



4.协议的继承 

协议能够继承一个或多个其他协议,可以在继承的协议的基础上增加新的要求。

你可以在协议的继承列表中,通过添加 class 关键字来限制协议只能被类类型遵循,而结构体或枚举不能遵循该协议。class 关键字必须第一个出现在协议的继承列表中,在其他继承的协议之前 

 
          

protocol InheritingProtocol: class, SomeProtocol, AnotherProtocol { 

// 这里是协议的定义部分 


5.可选的协议要求 

可选要求用在你需要和 Objective-C 打交道的代码中。 

协议和可选要求都必须带上 @objc 性。标记 @objc 特性的协议只能被继承自 Objective-C 类的类或者 @objc 类遵循,其他类以及结构体和枚举 均不能遵循这种协议。 

 
      

@objc protocol CounterDataSource {

    optional func incrementForCount(count: Int) -> Int

    optional var fixedIncrement: Int { get }





你可能感兴趣的:(OC老鸟学Swift)