一、使用类的好处
1.封装性
2.抽象性
3.采用命名空间来避免冲突
4.表意性极强的语句
5.可拓展性
在Swift中,前三点使用结构体和枚举就也完全可以实现。
二、在以往的面向对象编程中,只有类才能提供的
1.类的继承层次体系
2.类由于方法变量可重载所具有的可定制和重用性
在Swift中,可定制性用结构体也可实现。
三、类的使用代价
1.引用类型带来的隐式共享(implicit sharing)
2.你需要继承父类的一切
它太过臃肿,所有可能相关的都被一股脑丢了进去,而且你在一开始就必须决定好你的父类,而不是后期根据需求选择。
3.类的抽象性导致类型之间的关系信息丢失(Lost Type Relationship)
你需要用as! 对抽象的类型进行进一步的明确。
四、我们需要一种更好的抽象机制
2.支持静态类型关系(static type relationship)和动态派发
4.支持可回溯的模型设计
5.不存数据
6.没有初始化负担
7.明确接收者要实现什么(与类方法重载的模糊性形成对比)
五、Swift是一门面向协议(Protocol-Oriented)的编程语言
六、一切从协议开始
2.不再需要重载
protocol
Ordered {
func precedes(other: Self ) -> Bool
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
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
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.同质化而不是异质化的思考方式
4.采用效率更高的静态派发方式
八、协议拓展
语法见四天前的 Swift2.0语法更新(二)
Renderer 是Protocol,TestRenderer 是满足Renderer 的结构体。
若以图二所示的方式定义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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。