54.swift的协议扩展需要特别注意的地方

swift的协议扩展中有语法说明:

你可以使用协议扩展来给协议的任意方法或者计算属性要求提供默认实现。如果遵循类型给这个协议的要求提供了它自己的实现,那么它就会替代扩展中提供的默认实现。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if let demo = self as? Demo {
            print(demo.sharedFrame)
        }
        print(self.sharedFrame)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
extension ViewController:Demo{
    var shardView: UIView {
        return self.view
    }
    var sharedFrame: CGRect{
        return CGRect(x: 0, y: 0, width: 30, height: 30)
    }
}

protocol Demo {
    var shardView:UIView{
        get
    }
}
extension Demo{
    var sharedFrame:CGRect{
        return shardView.frame
    }
}

上面这段代码打印的结果是不一样的
第一个打印的是 sharedView.frame的值
第二个打印的是 CGRect(x: 0, y: 0, width: 30, height: 30)的值
可以看出如果将对象转化成协议类型对象后,它所使用的将是协议的默认实现,和通常的类继承不同。

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

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,092评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • 132.转换错误成可选值 通过转换错误成一个可选值,你可以使用 try? 来处理错误。当执行try?表达式时,如果...
    无沣阅读 1,275评论 0 3
  • 参考资源《swifter》https://github.com/iOS-Swift-Developers/Swif...
    柯浩然阅读 1,466评论 0 6
  • 阳光终于战胜夜魔的日子里!️️️️️️️ 心之所向亦即爱之所向!️
    锁江一龙阅读 80评论 1 0