Swift面向协议编程

翻译 2015年07月10日 17:15:27
一、使用类的好处
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)

protocolOrdered {
   
func precedes(other: Self) ->Bool
}

4.将异质声明转化为同质

当Ordered为Class时:

funcbinarySearch(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时:

funcbinarySearch<T: Ordered>(sortedKeys: [T], forKey k:T) ->Int{
   varlo =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.采用效率更高的静态派发方式

八、协议拓展
语法见四天前的 Swift 2.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 408https://developer.apple.com/videos/wwdc/2015/?id=408

相关文章推荐

iOS开发:面向协议编程与 Cocoa 的邂逅 (上)

喵神原文地址:https://onevcat.com/2016/11/pop-cocoa-1/ 本文是笔者在 MDCC 16 (移动开发者大会) 上 iOS 专场中的主题演讲的文字整理。您可...

面向协议编程

--

Android 面向协议编程 体会优雅编程之旅

Android中面向协议编程的深入浅出http://blog.csdn.net/sk719887916/article/details skay编写说起协议,现实生活中大家第一感觉会想到规则或者约定,...

Swift面向协议编程(附代码)

什么是swift协议?Protocol Swift标准库中有50多个复杂不一的协议,几乎所有的实际类型都是妈祖若干协议的。protocol是Swift语言的底座,语言的其他部分正是在这个底座上组织和...

接口编程那些事(或者面向协议编程)

http://www.cocoachina.com/ios/20151214/14656.html 接口是一系列可调用方法的集合。何为接口编程?接口编程是指当写一个函数或一个方法时,...

Swift 面向协议编程

在 WWDC 2015上,苹果发布了 Swift 2.0 版本,这是自 Swift 发布以来进行的第二次重大改版,这次改进推出了很多新特性来帮助我等程序员写出更优雅的代码。 在这些新特性里面,最...

优雅的开发TableView

前言UITableView(UITableViewController)是iOS开发使用频率最高的一个组件。不管是使用UITableView还是还是UITableViewController,在开发的...

深入理解Objective C的ARC机制

从Runtime源码和汇编的角度深入挖掘ARC的本质

Alamofire的设计之道

前言:Alamofire是一个由Swift编写的优雅的网络开发框架。大部分用Swift编写的iOS App的网络模块都是基于Alamofire的。作为Swift社区最活跃的几个项目之一,有许多开发者在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)