Overriding methods in Swift extensions

面向协议编程(Protocol Oriented Programming, 以下简称POP)是Apple在2015年WWDC上提出的一种Swift编程范式。通过查看Swift头文件,我们能够发现,基本上每一个Swift的类型都或多或少的准讯某一个协议。

OOP:通过继承和封装,将一系列相关的内容放到一起。

开发过程中,我们经使用两种方式来组织代码。一种是继承、另一种是组合。往往,我们更喜欢通过组合的方式来完成特定功能的设计。

那么相比于继承、组合又有哪些优势呢?

  1. 组合往往是即插即用,我们需要某个功能,直接拿来就好了。而继承不同,需要使当前类继承某一个类,才能使用父类提供的功能。
  2. OC与Swift都不支持多继承,当你需要的功能分散在两个不同的父类之中时,无法同时继承两者。
  3. 继承,会引入大量并不关心、也并不需要的附加功能,明显增加了代码维护的成本。
  4. 继承无法用于处理两种不同事物同时具备的相同特性。因为两条独立的继承链条,无法找到一个公共的父类。
    对比就会发现,组合更轻量级,而继承,相对复杂。

当然,没有错误的模式,只有用错地方的模式。 //总结起来

  1. implicit sharing(隐式共享)
  2. 从父类继承所有的东西
  3. 丢失了类型之间的关系

//: 1. 需要进行强制转换 //: 2. 我们无法知道other到底是什么类型。有可能是其他AOrderedClass的子类,其他子类传进来时合法的,但是,执行会奔溃,存在隐患。 //: 3. 丢失了类型的关系 //: 4. 用这种方式来实现多态,存在隐患 //: 5. 当父类做了某些修改的时候,子类都会受到影响

  1. 继承
  2. 组合模式

每一个协议都代表着某一个功能or某一个行为。

通过对协议的准守,你可以使自己具有有一种功能。

OOP的这些问题,使得在这些场景的运用中,会产生缺陷。

Swift,提出了一种解决方案,那就是面向协议编程。

Swift是第一门面向协议编程的语言。
那么,就产生了两个问题

  1. 什么叫面向协议编程?
  2. 为什么要面向协议,与面向对象相比,有哪些好处?

基本概念、决策模型

在考虑这两个问题之间,我们先来看看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中,结构体简直就是一个低配版的类。
在类的基础上,去掉了所有动态的特性,保留下了静态的特性。
因为他们之间还有几个重要的点:

  1. struct是value-type,而class是reference-type
  2. struct不可以继承
  3. 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 如何打造一个让人愉快的框架

results matching ""

    No results matching ""