Swift协议的动态、静态派发

在Swift中协议具有强大的功能。通过拓展,不仅能在协议中添加已于方法的具体实现,还能添加新的方法。

通过协议拓展来增加代码和继承的优势:

  1. 不需要强制继承某一个父类。
  2. 可以让已经存在的类型遵循协议。
  3. 协议可以用于类,也可以用于结构体和枚举。
  4. 使用协议,不用在乎super方法的调用。
  • 需要注意的一点,在协议中定义的方法是动态派发的,在协议拓展中实现方法(没有在协议主体中声明的)是静态派发。动态派发指的是在变量具体是哪一种类型,就到具体的类型中找方法的实现(不在乎声明变量时候 声明的是什么类型),如果有就调用,如果没有再去调协议拓展中的实现。静态派发指的是 变量声明时候指定的是哪一种类型,就到这个类型中去找方法的实现,即使它的实际类型有其他的实现,也不会去调用。

For example:

protocol Fruit{
    func ripe()
}
extension Fruit{
    func ripe(){
        print ("Fruit ripe.")
    }
    func name(){
        print("Fruit")
    }
}
struct Banana : Fruit{
    func ripe(){
        print ("Banana ripe.")
    }
    func name(){
        print("Banana")
    }
}

Based on the definition, we call the methods.

let a : Fruit = Banana()
let b : Banana = Banana()
a.ripe()
b.ripe()
a.name()
b.name()

The output should be:

Banana ripe
Banana ripe
Fruit
Banana

由于name方法并没有在协议中定义,属于静态派发。所以即便a的实际类型是Banana,但是并不会去调用Banana中name方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文: Method Dispatch in Swift作者: Brain King译者: kemchenj 译者...
    kemchenj阅读 9,194评论 11 91
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,908评论 25 708
  • 文章转载:https://onevcat.com/2016/11/pop-cocoa-1/ (作者非常棒,建议大家...
    Buddha_like阅读 475评论 0 0
  • 作为单身大龄女青年,相亲的次数多了,总会碰到一个两个奇奇怪怪的人,不是开玩笑的话,家长们但凡觉得是异性,活...
    闲度阅读 223评论 2 1
  • 本品为常用中药。始载《本草纲目》,原名“番木鳖”。 别名:马前子、马钱。 来源:为马钱科常绿乔木马钱和同科攀援状木...
    沉迷宝宝阅读 1,054评论 0 0