Overriding methods in Swift extensions
面向协议编程(Protocol Oriented Programming, 以下简称POP)是Apple在2015年WWDC上提出的一种Swift编程范式。通过查看Swift头文件,我们能够发现,基本上每一个Swift的类型都或多或少的准讯某一个协议。
OOP:通过继承和封装,将一系列相关的内容放到一起。
开发过程中,我们经使用两种方式来组织代码。一种是继承
、另一种是组合
。往往,我们更喜欢通过组合的方式来完成特定功能的设计。
那么相比于继承、组合又有哪些优势呢?
- 组合往往是即插即用,我们需要某个功能,直接拿来就好了。而继承不同,需要使当前类继承某一个类,才能使用父类提供的功能。
- OC与Swift都不支持多继承,当你需要的功能分散在两个不同的父类之中时,无法同时继承两者。
- 继承,会引入大量并不关心、也并不需要的附加功能,明显增加了代码维护的成本。
- 继承无法用于处理两种不同事物同时具备的相同特性。因为两条独立的继承链条,无法找到一个公共的父类。
对比就会发现,组合更轻量级,而继承,相对复杂。
当然,没有错误的模式,只有用错地方的模式。 //总结起来
- implicit sharing(隐式共享)
- 从父类继承所有的东西
- 丢失了类型之间的关系
//: 1. 需要进行强制转换 //: 2. 我们无法知道other到底是什么类型。有可能是其他AOrderedClass的子类,其他子类传进来时合法的,但是,执行会奔溃,存在隐患。 //: 3. 丢失了类型的关系 //: 4. 用这种方式来实现多态,存在隐患 //: 5. 当父类做了某些修改的时候,子类都会受到影响
- 继承
- 组合模式
每一个协议都代表着某一个功能or某一个行为。
通过对协议的准守,你可以使自己具有有一种功能。
OOP的这些问题,使得在这些场景的运用中,会产生缺陷。
Swift,提出了一种解决方案,那就是面向协议编程。
Swift是第一门面向协议编程的语言。
那么,就产生了两个问题
- 什么叫面向协议编程?
- 为什么要面向协议,与面向对象相比,有哪些好处?
基本概念、决策模型
在考虑这两个问题之间,我们先来看看Swift中struct与class的异同。
Description | class | struct |
---|---|---|
Define properties to store values | yes | yes |
Define methods to provide functionality | yes | yes |
Define subscripts to provide access to their values using subscript syntax | yes | yes |
Define initializers to set up their initial state | yes | yes |
Be extended to expand their functionality beyond a default implementation | yes | yes |
Conform to protocols to provide standard functionality of a certain kind | yes | yes |
Inheritance enables one class to inherit the characteristics of another | yes | no |
Type casting enables you to check and interpret the type of a class instance at runtime | yes | no |
Deinitializers enable an instance of a class to free up any resources it has assigned | yes | no |
Reference counting allows more than one reference to a class instance | yes | no |
对于class来说,oc有的,基本都有。之所以说基本都有是因为Swift的class不要去都继承自NSObject
类,所以,某些类,是不具备运行时特性的。
再看结构体,在Swift中,结构体简直就是一个低配版的类。
在类的基础上,去掉了所有动态的特性,保留下了静态的特性。
因为他们之间还有几个重要的点:
- struct是
value-type
,而class是reference-type
- struct不可以继承
- struct和class都可以实现Protocol
先讨论一下
附录
Beyond Crusty: Real-World Protocols
面向协议编程与 Cocoa 的邂逅 (上)
面向协议编程与 Cocoa 的邂逅 (下)
onevcat-swift-3
面向协议的MVVM
Swift 面向协议编程入门
真刀真枪面向协议编程
Real-World Protocols
A Little Respect for AnySequence
Protocol Oriented Networking Layer In Swift
Protocol-Oriented Networking
如何打造一个让人愉快的框架