Swift面向协议编程
发布时间:2020-12-14 02:43:20 所属栏目:百科 来源:网络整理
导读:一、使用类的好处 1.封装性 2.抽象性 3.采用命名空间来避免冲突 4.表意性极强的语句 5.可拓展性 在Swift中,前三点使用结构体和枚举就也完全可以实现。 二、在以往的面向对象编程中,只有类才能提供的 1.类的继承层次体系 2.类由于方法变量可重载所具有的可
一、使用类的好处
1.封装性
2.抽象性
3.采用命名空间来避免冲突
4.表意性极强的语句
5.可拓展性
在Swift中,前三点使用结构体和枚举就也完全可以实现。
二、在以往的面向对象编程中,只有类才能提供的
1.类的继承层次体系
2.类由于方法变量可重载所具有的可定制和重用性
在Swift中,可定制性用结构体也可实现。
三、类的使用代价
1.引用类型带来的隐式共享(implicit sharing)
为此,你有时需要不断的调用copy来给每个可变量(mutable)自己的值,而且会降低系统的运行效率,可能会导致死锁,使代码变得更加复杂,还会导致各种Bug。
以往collectionType的绝对分享性会导致的各种问题在Swift中不会出现,因为Swift中collectionType是值类型而不是引用类型,它们不分享。
2.你需要继承父类的一切
它太过臃肿,所有可能相关的都被一股脑丢了进去,而且你在一开始就必须决定好你的父类,而不是后期根据需求选择。
如果父类有存储类型的变量,你别无选择必须全部接受它们。而且要对它们进行初始化,还要注意不破坏父类的常量。
你需要选择是否和如何以可行的方式对父类方法进行重载。
3.类的抽象性导致类型之间的关系信息丢失(Lost Type Relationship)
你在什么信息都不了解的时候,还必须在最初的父类中一定会被重载方法里面放一些代码。
你需要用as! 对抽象的类型进行进一步的明确。
四、我们需要一种更好的抽象机制
1.支持值类型(包括类)
2.支持静态类型关系(static type relationship)和动态派发
4.支持可回溯的模型设计
5.不存数据
6.没有初始化负担
7.明确接收者要实现什么(与类方法重载的模糊性形成对比)
五、Swift是一门面向协议(Protocol-Oriented)的编程语言
六、一切从协议开始
1.避免了书写不必要的方法实现代码
2.不再需要重载
3.在协议方法定义中中使用self来解决类型关系丢失(Lost Type Relationship)
protocol
Ordered {
func precedes(other: Self ) -> Bool
}
4.将异质声明转化为同质
当Ordered为Class时:
func
binarySearch(sortedKeys: [
Ordered
],forKey k:
Ordered
) ->
Int
{
var lo = 0 var hi = sortedKeys. count while hi > lo { let mid = lo + (hi - lo) / 2 if sortedKeys[mid].precedes(k) { lo = mid + 1 } else { hi = mid } } return lo
}
当Ordered为Protocol时:
func
binarySearch<T: Ordered>(sortedKeys: [
T
],forKey k:
T
) ->
Int
{
var
lo =
0
var hi = sortedKeys. count while hi > lo { let mid = lo + (hi - lo) / 2 if sortedKeys[mid]. precedes (k) { lo = mid + 1 } else { hi = mid } } return lo
}
七、若你在Protocol 中使用Self ,Protocol 与Class 的差异会变的更大
1.采用泛型而不是类型
2.同质化而不是异质化的思考方式
3.类型实例之间的交流不再意味着两个类型之间的交流
4.采用效率更高的静态派发方式
八、协议拓展
语法见四天前的 Swift2.0语法更新(二)
Renderer 是Protocol,TestRenderer 是满足Renderer 的结构体。
第一张图对Renderer进行了拓展,添加了两个方法,一个是原protocol中要求的CircleAt 和新添加的RectangleAt。
第二张图对结构体TestRenderer进行了拓展,添加了两个相同的方法。
若以图二所示的方式定义r,CircleAt会调用extension
TextRenderer中的CircleAt,而RectangleAt会调用 extension Render中的RectangleAt。
在该种定义方式中,优先级:在原协议中被未要求的协议拓展方法 > 类型拓展方法 > 在原协议中被要求的协议拓展方法。
九、More Protocol Extension Tricks 因水平有限暂不翻译
十、什么时候我们该用类
1.对实例的比较和复制没有意义的时候(例如:Window)
2.实例的生命周期取决于外部影响的时候(例如:暂时性的文件)
3.实例只能够被写入来影响外部状态(例如:CGContext)
4.而且不要对抗面向对象的系统API
十一、总结
Protocol > Superclasses
Extension protocol 很神奇
英文原版视频请见WWDC Session 408
https://developer.apple.com/videos/wwdc/2015/?id=408
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |