前言

好久没有写文章了,期末复习周也到了。在复习的同时顺便开了一个专题,面向协议编程,[ 基础篇 ],[ 进阶篇 ],[ 实践篇 ]。

介绍

首先,面向对象(OOP)大家并不陌生,苹果的很多框架都是以这种形式进行构建的,但是,苹果很矫情,2015年WWDC来,鼓励使用 Value Type 值类型,也引出了这么一个话题Protocol Oriented Programming 面向协议编程方式。关于值类型和引用类型,可以查看官方文档或者这篇博客[推荐略看一下]

OOP的发展已经很多年了,一直作为一种主流,苹果的框架也是在一层又一层的继承搭建起来的,但是在水果已经在不断地强调使用Protocol了,自然有它的原因所在。

  • 在OOP中,不支持多继承的关系,往往定义一个BaseController,再往里面添加方法,会造成代码很难维护(资料)
  • 因为class是引用类型,所以可能会出现一些引用计数,引用循环等问题,你必须处理好这些问题。
  • 子类继承超类的时候,需要重写很多你并不需要的实例或者方法。

“Instead of using a class, start with a protocol”.

Paste_Image.png

认识Protocol

引用苹果官方文档的说明,Protocol定义一张蓝图,并且能被class,struct,enum 继承。而且,最重要的是支持多继承的关系。

A protocol defines a blueprint of methods, properties, and other requirements ... The protocol can then be adopted by a class, structure, or enumeration.

正好今早学校宠物节?,下面我们定义一个Dog的协议。

struct Person {var name: String
}
protocol Dog {var name: String { get }var owner: Person { get }var age: Int { get }
}复制代码

然后声明一个struct遵循该协议

struct Husky: Dog {let name: String // 实例的name不能修改let owner: Person var age: Int
//    不需要init( ) 也不需要override
//    init(name: String, owner: Person, age: Int) {//        self.name = name
//        self.owner = owner
//        self.age = age
//    }
}复制代码

协议的组合,和多继承

我们的狗狗在宠物节是要去参加比赛的,所以我们定义一个Playable的协议

protocol Playable {var GameName: String { get }func playGame()
}复制代码

我们知道在OOP的世界里,是不支持多继承的关系的。Protocol的出现直接修补了这个DrawBack。

我们组合一下两个协议

protocol DogCanPlay: Dog, Playable { }复制代码

接下来声明一个struct遵循这个协议,这样这个struct就拥有了这两个协议的所有属性和方法,而且,编译器还会告诉你,你缺少哪个属性,哪个方法没有声明,非常方便。

struct PlayableDog: DogCanPlay {var name: Stringvar owner: Personvar age: Intfunc playGame() {print("biubiubiu~")}var GameName: String
}复制代码

协议的组合原理也是多继承的关系,上面的代码也可以这么写

struct PlayableDog: Dog, Playable {var name: Stringvar owner: Personvar age: Intfunc playGame() {print("biubiubiu~")}var GameName: String
}复制代码

协议的扩展

不得不说,自Swift 2.0后,协议扩展【Protocol Extension】的出现,让面向协议编程更加地powerful,强力推荐这个WWDC Session

extension DogCanPlay {func playGame() { //  为协议添加默认实现print("biubiu~~")}func loseGame() {   //添加额外方法print("??")}
}复制代码

由于添加了默认实现,struct的定义就可以省去了playGame( )

struct Husky: DogCanPlay {var name: Stringvar owner: Personvar age: Intvar GameName: String
}复制代码

实例一个变量试试~

var myDog = Husky(name: "小黄", owner: Person(name: "大东"), age: 4, GameName: "接飞盘")
myDog.playGame() // biubiu~
myDog.loseGame() // ??复制代码

协议的多态

我们知道,OOP有多态的特征,在POP里,也支持?

struct Dalmatian: DogCanPlay {var name: Stringvar owner: Personvar age: Intvar GameName: String
}复制代码

建立两个实例

let myDog = Husky(name: "小黄", owner: Person(name: "大东"), age: 4, GameName: "接飞盘")
let otherDog = Dalmatian(name: "达尔马提亚狗", owner: Person(name: "洪**"), age: 4, GameName: "赛跑")复制代码

??

var competitionDog: [DogCanPlay] = [myDog, otherDog]
for dog in competitionDog {print(dog.name) //小黄//达尔马提亚狗
}复制代码

总结

基础篇就介绍到这。往后,我会介绍protocol中where语法的使用,还有POP在UIKit的实践。喜欢请点个赞?
ARC and Memory Management in Swift
Introducing Protocol-Oriented Programming in Swift 3

Think Different

Swift 面向协议编程 基础篇 (一) 介绍相关推荐

  1. Swift 面向协议编程的那些事

    一直想写一些 Swift 的东西,却不知道从何写起.因为想写的东西太多,然后所有的东西都混杂在一起,导致什么都写不出来.翻了翻以前在组内分享的一些东西,想想把这些内容整理下,写进博客吧.我对计划要写的 ...

  2. Spring.NET学习笔记12——面向切面编程(基础篇) Level 300

    AOP即面向切面编程(Aspect Oriented Programming的缩写),是OOP(面向对象编程)的一种延续形式.是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添 ...

  3. 知道swift为什么是面向协议编程么?不知道,还不快来学习!

    swift为什么是面向协议编程 面向协议编程 (Protocol Oriented Programming) 是 Apple 在 2015 年 WWDC 上提出的 Swift 的一种编程范式. 面向协 ...

  4. 面向协议编程与 Cocoa 的邂逅(上)

    作者简介: 王巍(@onevcat),江湖人称"喵神",iOS 和 Unity3D 开发者,旅居日本,目前供职于 LINE,著有<Swifter - 100 个 Swift ...

  5. Python编程基础篇

    python编程基础篇之第二节环境搭建和软件安装 文章目录 python编程基础篇之第二节环境搭建和软件安装 前言 一.python介绍 1. python简介 2. python的应用方向 3. p ...

  6. [内核编程] 内核环境及其特殊性,驱动编程基础篇

    [内核编程] 内核环境及其特殊性,驱动编程基础篇  在学习汉江独钓一书后,打算总结一下内核编程应该注意的事项,以及有关的一些基础知识.第一次接触内核编程,还真是很生疏,很多东西不能一下马上消化.这里做 ...

  7. Python学习之旅(核心编程基础篇003运算符)

    Python学习之旅 Python核心编程基础篇2020.12.18 一.算数运算符 二.比较运算符 三.赋值运算符 四.逻辑运算符 五.成员运算符 六.身份运算符 七.三目运算符 八.运算符优先级 ...

  8. Java基础编程——基础语法及介绍

    Java基础编程--基础语法及介绍 介绍 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共 ...

  9. 万物互联之~网络编程基础篇

    入门篇¶ 官方文档:https://docs.python.org/3/library/ipc.html(进程间通信和网络) 实例代码:https://github.com/lotapp/BaseCo ...

最新文章

  1. 怎么用canvas画秒针_用canvas画一个钟表
  2. 34.angularJS的{{}}和ng-bind
  3. Android studio 中引用jar的其实是Maven?(一)
  4. 爬取B站免费视频--python代码赶快拿
  5. python性能测试模块_技巧python模块性能测试-阿里云开发者社区
  6. 夜神模拟器:adb命令
  7. WPF 自定义文本框输入法 IME 跟随光标
  8. 量子纠缠 计算机,计算机科学家利用量子纠缠系统,证实44年前的一个猜想是错误的...
  9. Gitea服务器ip变更项目无法创建、拉取、上传
  10. 【历史上的今天】12 月 20 日:苹果收购 NeXT;苏联超级计算机先驱诞生;《绝地求生》发布
  11. 网络、域名、DNS、A记录以及MX记录的基本概念
  12. 雅思大作文写作--Cities
  13. android 获取视频编码,Android视频编码
  14. zookeeper(1)
  15. 软硬整合:开发一款VR大作背后的技术支撑
  16. 软件 | 快速计算网络自然连通度评估群落稳定性
  17. 【生活】年化收益率、七日年化收益率这些事
  18. 任正非:春风送暖入屠苏——2010年新年献词
  19. 使用微信小程序获取附近人的位置遇到的坑
  20. 【RL笔记】基于tensorflow实现RL的policy based算法

热门文章

  1. OpenMV(四)--STM32实现特征检测
  2. java模拟摇摆小球程序代码_Android实现左右摆动的球体动画效果
  3. Array flat
  4. 大专学计算机应用难吗,上了两年技校,专业是计算机应用,什么也没学到。现在想在去上个大专。学什么专业好呢。?...
  5. 299 Bulls and Cows 猜数字游戏
  6. Golang遇到的问题记录
  7. 在DLL Project中定义配置文件
  8. multipart/form-data
  9. 用闭包的写法弹出元素的索引值
  10. Java字节流和字符流区别