swift协议

1.协议

  • 协议的语法:

  • 定义协议

  • 遵守协议:在类型名称后面,加上协议名称,用: 隔开,协议之间用,隔开

  • 继承父类的子类的时候,应该把父类写在协议前面,

    protocol SomeProtocol {}
    class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {}
    复制代码
  • 属性要求

  • 协议中定义了属性,遵守该协议的实例或类型,必须有这个属性

  • 协议的中定义属性,只指定属性的名称和类型,还指定属性的可读性,可写性,

  • 方法要求

  • 和普通方法一样,但不需要{} 和方法体,方法的参数列表也不支持默认值

  • Mutating 方法要求

  • 如果你在协议中定义了一个实例方法,该方法会改变遵循该协议的类型的实例,那么在定义协议时需要在方法前加 mutating 关键字。这使得结构体和枚举能够遵循此协议并满足此方法要求。

  • 构造器要求

  • 协议可以要求遵循协议的类型实现指定的构造器。你可以像编写普通构造器那样,在协议的定义里写下构造器的声明,但不需要写花括号和构造器的实体

  • 实现的时候,遵守代理的构造器方法需要加上关键字required

  • 如果一个类是定义了final,不需要在写required,因为不会有子类,final是为了防止重写

  • 如果子类重写了父类的指定构造器,并且指定构造器遵循了某个协议,该方法同时需要写关键字requiredoverri

  • 协议作为类型

    class Dice {
        let sides: Int
        let generator: RandomNumberGenerator
        init(sides: Int, generator: RandomNumberGenerator) {
            self.sides = sides
            self.generator = generator
        }
        func roll() -> Int {
            return Int(generator.random() * Double(sides)) + 1
        }
    }
    复制代码
  • Dice 类提供了一个名为 roll 的实例方法,用来模拟骰子的面值。它先调用 generator 的 random() 方法来生成一个 [0.0,1.0) 区间内的随机数,然后使用这个随机数生成正确的骰子面值。因为 generator 遵循了 RandomNumberGenerator 协议,可以确保它有个 random() 方法可供调用

2.委托(代理)模式

  • protocol - delegate

3.通过扩展添加协议一致性,通过扩展遵循协议

  • 当一个类型已经符合了某个协议中的所有要求,却还没有声明遵循该协议时,可以通过空扩展体的扩展来遵循该协议:

4.协议类型的集合,协议的继承

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

  • 例子中定义了一个新的协议 PrettyTextRepresentable,它继承自 TextRepresentable 协议。任何遵循 PrettyTextRepresentable 协议的类型在满足该协议的要求时,也必须满足 TextRepresentable 协议的要求

5.类类型专属协议

  • 只适用一某种类型

6.协议合成

  • 有时候需要同时遵循多个协议,你可以将多个协议采用 SomeProtocol & AnotherProtocol 这样的格式进行组合,称为 协议合成(protocol composition)。你可以罗列任意多个你想要遵循的协议,以与符号(&)分隔。

7.检查协议一致性

  • Circle,Country,遵守了HasArea协议,协议中有只读的area属性

  • Animal 没有遵守HasArea协议

  • 上面三个各自实例,判断是不是符合某个协议的,使用as?, 返回可选值,进行可选值绑定

8.可选的协议要求

  • 可选的时候使用optional 关键字
  • 可选要求用在你需要和 Objective-C 打交道的代码中。协议和可选要求都必须带上@objc属性
    @objc protocol CounterDataSource {
        optional func incrementForCount(count: Int) -> Int
        optional var fixedIncrement: Int { get }
    }
    复制代码

8.协议扩展

  • 协议可以通过扩展来为遵循协议的类型提供属性、方法以及下标的实现。通过这种方式,你可以基于协议本身来实现这些功能,而无需在每个遵循协议的类型中都重复同样的实现,也无需使用全局函数

  • 扩展RandomNumberGenerator协议,增加randomBool() 方法

    extension RandomNumberGenerator {
        func randomBool() -> Bool {
        return random() > 0.5
        }
    }
    复制代码
  • 提供默认实现

  • 为协议扩展添加限制条件

  • 在扩展协议的时候,可以指定一些限制条件,只有遵循协议的类型满足这些限制条件时,才能获得协议扩展提供的默认实现。这些限制条件写在协议名之后,使用 where 子句来描述

  • textualDescription返回整个集合的文本描述,讲文本描述用,拼接起来,包括在【】中

  • Hamster 结构体符合TextRepresentable协议,放在一个数组中,array 符合CollectionType协议,

  • 可以进行textualDescription方法,

  • 如果多个协议扩展都为同一个协议要求提供了默认实现,而遵循协议的类型又同时满足这些协议扩展的限制条件,那么将会使用限制条件最多的那个协议扩展提供的默认实现

转载于:https://juejin.im/post/5b8f9a8b6fb9a05cf22fd102

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值