加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读