引用类型 (Reference Type Matters)、扩展与派发方式
扩展 方式 类型 type 引用 reference
2023-09-11 14:18:45 时间
引用类型 (Reference Type Matters)
引用的类型决定了派发的方式. 这很显而易见, 但也是决定性的差异. 一个比较常见的疑惑, 发生在一个协议拓展和类型拓展同时实现了同一个函数的时候.
protocol MyProtocol {
}
struct MyStruct: MyProtocol {
}
extension MyStruct {
func extensionMethod() {
print("结构体")
}
}
extension MyProtocol {
func extensionMethod() {
print("协议")
}
}
let myStruct = MyStruct()
let proto: MyProtocol = myStruct
myStruct.extensionMethod() // -> “结构体”
proto.extensionMethod() // -> “协议”
刚接触 Swift 的人可能会认为 proto.extensionMethod()
调用的是结构体里的实现. 但是, 引用的类型决定了派发的方式, 协议拓展里的函数会使用直接调用. 如果把 extensionMethod
的声明移动到协议的声明位置的话, 则会使用函数表派发, 最终就会调用结构体里的实现. 并且要记得, 如果两种声明方式都使用了直接派发的话, 基于直接派发的运作方式, 我们不可能实现预想的 override
行为. 这对于很多从 Objective-C 过渡过来的开发者是反直觉的.
作者:kemchenj
链接:https://www.jianshu.com/p/91bfe3f11eec
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
相关文章
- Android OkHttp文件上传与下载的进度监听扩展 (四)
- Retrofit上传/下载文件扩展实现进度的监听 (二)
- Intel8251可编程串行扩展
- 数仓工具—Hive语法之with扩展(21)
- chrome扩展
- linux内核如何为gpio 扩展芯片驱动添加设备节点?
- gnuc对c的扩展
- 代码的结合性:继承 扩展 组合 变换--swift暗含的四根主线
- 深入理解Spring源码之IOC 扩展原理BeanFactoryPostProcessor和事件监听ApplicationListener
- Visual Studio 2010扩展让JS与CSS实现折叠
- Three 之 three.js (webgl)物体描边效果(outline)三种实现方式的简单整理(后期渲染/MeshBasicMaterial/法线扩展)
- c#扩展方法简单
- 扩展数据流的三种方式
- spring-security-oauth2 中优雅的扩展自定义(短信验证码)登录方式-系列3
- javascript中原型,构造器,还有E5扩展的默认成员